隨機數(shù)在軟件設(shè)計,尤其是在實踐環(huán)境模擬和測試等領(lǐng)域中得到很廣泛的應(yīng)用。為追求真正的隨機序列,人們曾采用很多種原始的物理方法用于生成一定范圍內(nèi)滿足精度(位數(shù))的均勻分布序列,其缺點在于:速度慢、效率低、需占用大量存儲空間且不可重現(xiàn)等。為滿足計算機模擬研究的需求,人們轉(zhuǎn)而研究用算法生成模擬各種概率分布的偽隨機序列。偽隨機數(shù)是指用數(shù)學遞推公式所產(chǎn)生的隨機數(shù)。從實用的角度看,獲取這種數(shù)的最簡單和最自然的方法是利用計算機語言的函數(shù)庫提供的隨機數(shù)發(fā)生器。不同的開發(fā)環(huán)境提供的生成隨機數(shù)的函數(shù)和方法不一樣。典型情況下,它會輸出一個均勻分布在0和1區(qū)間內(nèi)的偽隨機變量的值。
隨機數(shù)發(fā)生器
在計算機中產(chǎn)生隨機數(shù)的方法,經(jīng)常采用下面的公式:

用這個公式產(chǎn)生0~65536的隨機數(shù)a1,a2,…序列的程序,稱為232步長的倍增諧和隨機數(shù)發(fā)生器。其中b、c、d為正整數(shù),d稱為由公式所產(chǎn)生的隨機序列的種子。
由該公式可以看出,一旦參數(shù)b、c、d確定之后,所產(chǎn)生的隨機序列也是確定的。這種只在一定程度上滿足隨機性的序列稱為偽隨機數(shù)。
下面是隨機數(shù)發(fā)生器的一個例子。其中,函數(shù)random_seed提供給用戶選擇隨機數(shù)的種子,當形式參數(shù)d=0時,取系統(tǒng)當前時間作為隨機數(shù)種子;當d≠0時,就選用d作為種子;函數(shù)random在給定種子的基礎(chǔ)上,計算新的種子,并產(chǎn)生一個范圍為low~high的新的隨機數(shù)。
ASP.NET中偽隨機數(shù)生成機制
計算機不可能產(chǎn)生完全隨機的數(shù)字。所謂的隨機數(shù)發(fā)生器都是通過一定的算法對事先選定的隨機種子做復(fù)雜的運算,用產(chǎn)生的結(jié)果來近似的模擬完全隨機數(shù),這種隨機數(shù)被稱作偽隨機數(shù)。偽隨機數(shù)是以相同的概率從一組有限的數(shù)字中選取的。所選數(shù)字并不具有完全的隨機性,但是從實用的角度而言,其隨機程度已足夠了。
1、VB.NET內(nèi)建函數(shù)
ASP.NET程序可以采用多種編程語言,其默認的程序語言是VB.net,雖然VB.NET和VB有些相似,但它們的應(yīng)用環(huán)境不一樣,編寫代碼的方法也有所不同。在VB.NET中,如果要使用數(shù)學函數(shù),必須通過.NET Framework提供的Math類,它位于System命名空間下,用戶可以在代碼頂部添加Imports System. Math以便使用這些數(shù)學函數(shù)。
其中用于產(chǎn)生隨機數(shù)的函數(shù)原型為:Rnd(x),該函數(shù)用以產(chǎn)生一個介于0~1之間的單精度隨機數(shù)。x是產(chǎn)生隨機數(shù)的種子。如果要從(min, max)這個范圍內(nèi)隨機抽取一個數(shù),此時需要用到公式:隨機數(shù) = (max - min) * Rnd(x) + min。
偽隨機數(shù)的選擇是從隨機種子開始的,為了保證每次得到的偽隨機數(shù)都足夠地“隨機”,隨機種子的選擇就顯得非常重要。如果選擇的隨機種子一樣則生成的隨機序列也相同。一般地,使用同系統(tǒng)時間有關(guān)的參數(shù)作為隨機種子,這也是.net Framework中的隨機數(shù)發(fā)生器默認采用的方法。
2、隨機數(shù)類System.Random
隨機數(shù)類System.Random類提供以下方法用于產(chǎn)生各種滿足不同要求的隨機數(shù),如表1所示:
表1 System.Random類提供的各種方法
使用隨機數(shù)類System.Random必須先聲明。如果要使用Nextbytes(byte())方法,在使用前也必須聲明字節(jié)數(shù)組。
3、測試程序編寫
在運行ASP.NET程序前必須建立其開發(fā)運行環(huán)境,包括配置Microsoft IIS和安裝.NET Framework SDK以及機MSE編輯器。MSE編輯器是Microsoft Office的一個附加軟件,作為ASP.NET的編輯工具非常方便。測試程序代碼如下:
隨機數(shù)發(fā)生器
在計算機中產(chǎn)生隨機數(shù)的方法,經(jīng)常采用下面的公式:

用這個公式產(chǎn)生0~65536的隨機數(shù)a1,a2,…序列的程序,稱為232步長的倍增諧和隨機數(shù)發(fā)生器。其中b、c、d為正整數(shù),d稱為由公式所產(chǎn)生的隨機序列的種子。
由該公式可以看出,一旦參數(shù)b、c、d確定之后,所產(chǎn)生的隨機序列也是確定的。這種只在一定程度上滿足隨機性的序列稱為偽隨機數(shù)。
下面是隨機數(shù)發(fā)生器的一個例子。其中,函數(shù)random_seed提供給用戶選擇隨機數(shù)的種子,當形式參數(shù)d=0時,取系統(tǒng)當前時間作為隨機數(shù)種子;當d≠0時,就選用d作為種子;函數(shù)random在給定種子的基礎(chǔ)上,計算新的種子,并產(chǎn)生一個范圍為low~high的新的隨機數(shù)。
#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中偽隨機數(shù)生成機制
計算機不可能產(chǎn)生完全隨機的數(shù)字。所謂的隨機數(shù)發(fā)生器都是通過一定的算法對事先選定的隨機種子做復(fù)雜的運算,用產(chǎn)生的結(jié)果來近似的模擬完全隨機數(shù),這種隨機數(shù)被稱作偽隨機數(shù)。偽隨機數(shù)是以相同的概率從一組有限的數(shù)字中選取的。所選數(shù)字并不具有完全的隨機性,但是從實用的角度而言,其隨機程度已足夠了。
1、VB.NET內(nèi)建函數(shù)
ASP.NET程序可以采用多種編程語言,其默認的程序語言是VB.net,雖然VB.NET和VB有些相似,但它們的應(yīng)用環(huán)境不一樣,編寫代碼的方法也有所不同。在VB.NET中,如果要使用數(shù)學函數(shù),必須通過.NET Framework提供的Math類,它位于System命名空間下,用戶可以在代碼頂部添加Imports System. Math以便使用這些數(shù)學函數(shù)。
其中用于產(chǎn)生隨機數(shù)的函數(shù)原型為:Rnd(x),該函數(shù)用以產(chǎn)生一個介于0~1之間的單精度隨機數(shù)。x是產(chǎn)生隨機數(shù)的種子。如果要從(min, max)這個范圍內(nèi)隨機抽取一個數(shù),此時需要用到公式:隨機數(shù) = (max - min) * Rnd(x) + min。
偽隨機數(shù)的選擇是從隨機種子開始的,為了保證每次得到的偽隨機數(shù)都足夠地“隨機”,隨機種子的選擇就顯得非常重要。如果選擇的隨機種子一樣則生成的隨機序列也相同。一般地,使用同系統(tǒng)時間有關(guān)的參數(shù)作為隨機種子,這也是.net Framework中的隨機數(shù)發(fā)生器默認采用的方法。
2、隨機數(shù)類System.Random
隨機數(shù)類System.Random類提供以下方法用于產(chǎn)生各種滿足不同要求的隨機數(shù),如表1所示:
表1 System.Random類提供的各種方法
編號 |
方法名稱 |
功能描述 |
1 |
Next() |
返回一個0~2147483647之間的整數(shù) |
2 |
Next(i) |
返回一個0~i之間的整數(shù) |
3 |
Next(i,j) |
返回一個i~j之間的整數(shù) |
4 |
Nextdouble() |
返回一個0~1之間的隨機小數(shù) |
5 |
Nextdouble( byte()) |
用0~255之間的隨機整數(shù)作為字節(jié)數(shù)組各元素的值。 |
使用隨機數(shù)類System.Random必須先聲明。如果要使用Nextbytes(byte())方法,在使用前也必須聲明字節(jié)數(shù)組。
3、測試程序編寫
在運行ASP.NET程序前必須建立其開發(fā)運行環(huán)境,包括配置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> |
其測試結(jié)果如圖1所示:
圖1 偽隨機數(shù)測試運行結(jié)果