足夠隨機的隨機數應用舉例

2021-08-29 06:37:30 字數 3511 閱讀 1163

在.net framework中提供了乙個專門用來產生隨機數的類system.random,使用這個類時必須匯入system命名空間。當然,命名空間system在每個asp.net頁面中都是自動匯入的,所以我們可以直接使用這個類。

對於隨機數,大家都知道,計算機不可能產生完全隨機的數字,所謂的隨機數發生器都是通過一定的演算法對事先選定的隨機種子做複雜的運算,用產生的結果來近似的模擬完全隨機數,這種隨機數被稱作偽隨機數。偽隨機數是以相同的概率從一組有限的數字中選取的。所選數字並不具有完全的隨機性,但是從實用的角度而言,其隨機程度已足夠了。偽隨機數的選擇是從隨機種子開始的,所以為了保證每次得到的偽隨機數都足夠地「隨機」,隨機種子的選擇就顯得非常重要。如果隨機種子一樣,那麼同乙個隨機數發生器產生的隨機數也會一樣。一般地,我們使用同系統時間有關的引數作為隨機種子,這也是.net framework中的隨機數發生器預設採用的方法。

我們可以使用兩種方式初始化乙個隨機數發生器:

第一種方法不指定隨機種子,系統自動選取當前時間作為隨機種子:

random ro = new random();

第二種方法可以指定乙個int型引數作為隨機種子:

int iseed=10;

random ro = new random(10);

之後,我們就可以使用這個random類的物件來產生隨機數,這時候要用到random.next()方法。這個方法使用相當靈活,你甚至可以指定產生的隨機數的上下限。

不指定上下限的使用如下:

int iresult;

iresult=ro.next();

下面的**指定返回小於100的隨機數:

int iresult;

int iup=100;

iresult=ro.next(iup);

而下面這段**則指定返回值必須在50-100的範圍之內:

int iresult;

int iup=100;

int idown=50;

iresult=ro.next(idown,iup);

除了random.next()方法之外,random類還提供了random.nextdouble()方法產生乙個範圍在0.0-1.0之間的隨機的雙精度浮點數:

double dresult;

dresult=ro.nextdouble();

另外乙個與random.nextdouble()方法相似的方法是random.sample(),它跟random.nextdouble()方法唯一的區別在於訪問級別,我們可以看看它們的原始宣告:

protected virtual double sample();

public virtual double nextdouble();

random.sample()方法是保護方法,只允許子類的物件訪問,而random.sample()方法則可以看作是random.sample()的公開版本。一般地,使用者在random的子類中重寫sample()方法來得到更一般的分布。

這個例子中,我們使用random.next()方法來產生隨機數。

下面這個函式是這個例子的核心,我們利用他來產生乙個隨機的int陣列:

private int getrandomarray(int length,int up,int down)private void getrandomdefault(ref int re)private void getrandombyint(ref byte re)

< /script >

< html >

< head >

< title >隨機數測試< /title >

是的,如你所見,產生了一樣的兩個隨機數,無論重複多少次,都是一樣的。原因在**呢?

不要以為使用系統時間作為隨機種子就萬無一失了——如果應用程式在乙個較快的計算機上執行,則該計算機的系統時鐘可能沒有時間在此建構函式的呼叫之間進行更改,random 的不同例項的種子值可能相同。這種情況下,我們就需要另外的演算法來保證產生的數字的隨機性。所以為了保證產生的隨機數足夠「隨機」,我們不得不使用複雜一點的方法來獲得隨機種子。

在上面的這段程式中,我們首先使用系統時間作為隨機種子,然後將上一次產生的隨機數跟迴圈變數和乙個與系統時間有關的整型引數相乘,以之作為隨機種子,從而得到了每次都不同的隨機種子,保證了產生足夠「隨機」的隨機數。

得到整型的隨機數組以後,我們將它變成字串,然後使用system.drawing中與gdi+相關的類生成乙個並且在網頁上顯示出來。

< %@ page language="c#" debug="true" trace="false" tracemode="sortbycategory"% >< % @import namespace="system.drawing" % >< % @import namespace="system.drawing.imaging" % >< % @import namespace="system.drawing.text" % >< % @import namespace="system.io" % >< script language=c# runat=server >

public void page_load(object sender,eventargs e)

private int getrandomarray(int length,int up,int down)

return rtarray;

}最後我們可以編寫乙個普通的html頁面來檢視效果,只要把的src屬性指向這個頁面就行了(這裡我們假設上面那個asp.net檔案的名字是「randompic.aspx」):

< !doctype html public "-//w3c//dtd html 4.0 transitional//en" >

< html >

< head >

< title > new document < /title >

< meta name="generator" content="editplus" >

< meta name="author" content="" >

< meta name="keywords" content="" >

< meta name="description" content="" >

< /head >

< body >

< img src="randompic.aspx" >

< /body >

< /html >

生成有足夠隨機性的隨機數

大致思路是使用足夠的運算和網路傳輸產生隨機性 1 迴圈若干次,做一組運算 因為即使同一臺計算機 每次執行的時間也不會相同,求運算消耗的時間 因此產生了初步的隨機性 2 重複步驟1 若干次 將得到的值乘上乙個較大的數字 如10000 作為運算的迴圈次數 進一步放大隨機性 3 多次重複步驟2 得到一些隨...

隨機數應用

隨機數應用 隨機呼叫1 3之間的整數 random.randint 1,3 in 50 random.randint 1,3 out 50 3 in 51 random.randint 1,3 out 51 2 in 52 random.randint 1,3 out 52 1 in 53 rand...

隨機數 偽隨機數

隨機數 偽隨機數 rand函式在產生隨機數前,需要系統提供的生成偽隨機數序列的種子,rand根據這個種子的值產生一系列隨機數。如果系統提供的種子沒有變化,每次呼叫rand函式生成的偽隨機數序列都是一樣的。srand unsigned seed 通過引數seed改變系統提供的種子值,從而可以使得每次呼...