摘 要 偽隨機數在電腦軟體設計上有廣泛的用途。本文介紹了偽隨機數產生的一般原理,以及利用ASP.NET Framework中提供的Random類別及其方法來產生各種不同範圍的滿足各種要求的隨機數。最後結合Web控制項表單闡述了ASP.NET中的隨機數在軟體設計上的應用。
關鍵字 ASP.NET;偽隨機數產生;Web; Random類別
隨機數在軟體設計,尤其是在實踐環境模擬和測試等領域中得到廣泛的應用。為追求真正的隨機序列,人們曾採用許多原始的物理方法用於產生一定範圍內滿足精度(位數)的均勻分佈序列,其缺點在於:速度慢、效率低、需佔用大量儲存空間且不可重現等。為滿足電腦模擬研究的需求,人們轉而研究用演算法產生模擬各種機率分佈的偽隨機序列。偽隨機數是指用數學遞推公式所產生的隨機數。從實用的角度看,獲取這種數字的最簡單和最自然的方法是利用電腦語言的函數庫提供的隨機數產生器。不同的開發環境提供的產生隨機數的函數和方法不一樣。典型情況下,它會輸出一個均勻分佈在0和1區間內的偽隨機變數的值。
隨機數字產生器
在計算機中產生隨機數的方法,經常採用下面的公式:
用這個公式產生0~65536的隨機數a1,a2,…序列的程序,稱為232步長的倍增諧和隨機數產生器。其中b、c、d為正整數,d稱為由公式產生的隨機序列的種子。
由此公式可以看出,一旦參數b、c、d確定之後,所產生的隨機序列也是確定的。這種只在一定程度上滿足隨機性的序列稱為偽隨機數。
下面是隨機數產生器的一個例子。其中,函數random_seed提供給使用者選擇隨機數的種子,當形式參數d=0時,取系統當前時間為隨機數種子;當d≠0時,就選用d作為種子;函數random在給定種子的基礎上,計算新的種子,並產生一個範圍為low~high的新的隨機數。
#define MULTIPLIER 0x015A4E35L
#define INCREMENT 1
void random_seed( unsigned long d){
if ( d == 0 )seed = time(0);
else seed = d;}
unsigned int random(unsigned long low,unsigned long high)
{
seed = MULTIPLIER * seed + INCREMENT;
return ((seed >>16 )% ( high-low ) + low );
}
}
ASP.NET中偽隨機數產生機制
電腦不可能產生完全隨機的數字。所謂的隨機數產生器都是透過一定的演算法對事先選定的隨機種子做複雜的運算,用產生的結果來近似的模擬完全隨機數,這種隨機數被稱為偽隨機數。偽隨機數是以相同的機率從一組有限的數字中選取的。所選數字並不具有完全的隨機性,但是從實用的角度而言,其隨機程度已經足夠了。
1.VB.NET內建函數
ASP.NET程式可以採用多種程式語言,其預設的程式語言是VB.NET,雖然VB.NET和VB有些相似,但它們的應用環境不一樣,編寫程式碼的方法也有所不同。在VB.NET中,如果要使用數學函數,必須透過.NET Framework提供的Math類,它位於System命名空間下,使用者可以在程式碼頂部新增Imports System. Math以便使用這些數學函數。
其中用於產生隨機數的函數原型為:Rnd(x),該函數用於產生一個介於0~1之間的單精度隨機數。 x是產生隨機數的種子。如果要從(min, max)這個範圍內隨機抽取一個數,此時需要用到公式:隨機數= (max - min) * Rnd(x) + min。
偽隨機數的選擇是從隨機種子開始的,為了確保每次得到的偽隨機數都足夠地“隨機”,隨機種子的選擇就顯得非常重要。如果選擇的隨機種子一樣則產生的隨機序列也相同。一般地,使用同系統時間有關的參數作為隨機種子,這也是.net Framework中的隨機數產生器預設採用的方法。
2.隨機數類System.Random
隨機數類System.Random類提供以下方法用於產生各種滿足不同要求的隨機數,如表1所示:
表1 System.Random類提供的各種方法
編號 | 方法名稱 | 功能描述 |
1 | Next() | 傳回一個0~2147483647之間的整數 |
2 | Next(i) | 傳回一個0~i之間的整數 |
3 | Next(i,j) | 傳回一個i~j之間的整數 |
4 | Nextdouble() | 傳回一個0~1之間的隨機小數 |
5 | Nextdouble( byte()) | 以0~255之間的隨機整數作為位元組數組各元素的值。 |
使用隨機數類System.Random必須先聲明。如果要使用Nextbytes(byte())方法,在使用前也必須宣告位元組數組。
3.測試程式編寫
在運行ASP.NET程式前必須建立其開發運行環境,包括配置Microsoft IIS和安裝.NET Framework SDK以及機MSE編輯器。 MSE編輯器是Microsoft Office的一個附加軟體,作為ASP.NET的編輯工具非常方便。測試程式碼如下:
<script language="vb" runat="server">
sub page_load(send as object,e as eventargs)
dim r1 as random =new random()
response.write("The result of r1.next()is:"+r1.next().tostring())
response.write("Theresultofr1.next(100)is:" +r1.next(100).tostring())
response.write("The result of r1.next(100,150) is:"+r1.next(100,150).tostring())
response.write("The result of r1.nextdouble() is:"+r1.nextdouble().tostring())
r1.nextbytes(r) // dim r(300) as byte
response.write("the r(100) is:")
response.write(r(199))
end sub </script>
其測試結果如圖1所示:
圖1 偽隨機數測試運行結果
實例開發
應用程式需求分析:創建一個用於模擬擲骰子遊戲的應用程式。此遊戲中,遊戲者將隨機滾動一個骰子。每一個骰子有六個面,分別代表1,2,3,4,5,6這六個點。當骰子停下以後,觀察骰子上表面的點數。如果擲得的點數為6,則提示贏的訊息,否則將繼續投擲。
1.關鍵技術
1.1 Web控制項表單
Web控制項表單具有高階語言的物件導向的特性,它是ASP.NET中System.Web.UI.WebControls命名空間的物件。其處理過程與HTML控件表單相似,有以下幾個特點:表單在伺服器端運行;輸入域都是控件,具有強大且豐富的屬性和方法,輸入域的資訊可以保留;具備對輸入域的驗證能力;包含有數據顯示控制項等。
一個典型的Web控制項表單程式碼如下:
<asp: button id=”sub3” text=”confirm” runat=”server”/>
其中ASP:XXX指明是哪一類Web控制項;ID屬性指明控制項的識別名稱; Runat屬性的值為server,指明這是在伺服器端執行的控制項。
本例將使用的Web控制項主要為按鈕控制項。其中Image控制項用於顯示影像文件,有以下幾個屬性:Imageurl,指明影像檔案的URL;Width,影像檔案顯示的寬度;Height,影像檔案顯示的高度等。
1.2 偽隨機數產生
根據需求分析描述,為模擬隨機投擲骰子所得到的點數,需要隨機產生範圍在1~6之間的整數,此時可利用到System.Random類的Next(i,j)方法,這裡i=1,j=7。 (筆者編寫了一個測試程式發現如果j=6,所產生的隨機數在1~5之間)
2.程式實作
程式的主要程式碼實作如下:
<script language="vb" runat="server">
sub disp(obj as object,e as eventargs)
dim r1 as random =new random() //定義一個隨機數類
dim file_prefix as string = "Imagesdie"
dim file_suffix as string = ".png"
value = r1. next(1,7) //dim value as Integer
s1 = file_prefix + value.tostring() + file_suffix
pic1.imageurl = s1 // 更新Image控制項的imageurl屬性
if value = 6 then disp.text = "You 更新Image控制項的imageurl屬性if value = 6 then disp.text = "You 更新Image控制項的imageurl屬性if value = 6 then
disp.text = "You wwin" / /顯示提示訊息
else
disp.text = "Try again"
end if
end sub
</script>
<form id="form1" runat="server"><br>
<asp:button id="disp" runat="server " onclick="disp" text="start"/>
<asp:image id="pic1" runat="server" width="50" height="50"/></form>
程式的運作結果如圖2所示:
圖2 程式運行結果
結束語
Web應用程式中有很多地方都要用到偽隨機數,如何選擇產生隨機序列的種子參數,以及選用何種隨機演算法以期生成性能更佳的偽隨機序列是電腦軟體開發人員追求的目標之一。利用ASP.NET框架提供了偽隨機數產生類別以及腳本語言VB.NET提供的函數方法可以產生各種滿足不同要求的隨機序列。如在Web系統中用於身分認證的隨機校驗碼就用到了隨機數產生的技術,這點在網站上有很多文章介紹,在此不再贅述。