Random快速連續產生相同隨機數

2021-06-04 12:08:46 字數 2903 閱讀 8465

random類是乙個產生偽隨機數字的類,它的建構函式有兩種,乙個是直接new random(),另外乙個是new random(int32),前者是根據觸發那刻的系統時間做為種子,來產生乙個隨機數字,後者可以自己設定觸發的種子,一般都是用uncheck((int)datetime.now.ticks)做為引數種子,因此如果計算機執行速度很快,如果觸發randm函式間隔時間很短,就有可能造成產生一樣的隨機數,因為偽隨機的數字,在random的內部產生機制中還是有一定規律的,並非是真正意義上的完全隨機。

random快速連續產生相同隨機數的解決方案:

1、延時的辦法。

可以採用for迴圈的辦法,也可以採用thread.sleep(100);

2、提高隨機數不重複概率的種子生成方法:

static int getrandomseed( )

random random = new random( getrandomseed( ) );

或者 random sourcegen = new random(new guid().gethashcode());

我們在做能自動生成試卷的考試系統時,常常需要隨機生成一組不重複的題目,在.net framework中提供了乙個專門用來產生隨機數的類system.random。

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

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

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

random ro = new random();

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

int iseed=10;

random ro = new random(10);

long tick = datetime.now.ticks;

random ran = new random((int)(tick & 0xffffffffl) | (int) (tick >> 32));

這樣可以保證99%不是一樣。

之後,我們就可以使用這個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類生成題號,會出現重複,特別是在數量較小的題目中要生成不重複的的題目是很難的,參考了網上的一些方法,包括兩類,一類是通過隨機種子入手,使每一次的隨機種子不同,來保證不重複;第二類是使用一些資料結構和演算法。下面主要就第二類介紹幾個方法。

方法1:思想是用乙個陣列來儲存索引號,先隨機生成乙個陣列位置,然後把這個位置的索引號取出來,並把最後乙個索引號複製到當前的陣列位置,然後使隨機數的上限減一,具體如:先把這100個數放在乙個陣列內,每次隨機取乙個位置(第一次是1-100,第二次是1-99,...),將該位置的數用最後的數代替。

int index = new int[15];

for (int i = 0; i < 15; i++)

index = i;

random r = new random();

//用來儲存隨機生成的不重複的10個數

int result = new int[10];

int site = 15;//設定下限

int id;

for (int j = 0; j < 10; j++)

方法2:利用hashtable。[nextpage]

hashtable hashtable = new hashtable();

random rm = new random();

int rmnum = 10;

for (int i = 0; hashtable.count < rmnum; i++)

} 方法3:遞迴,用它來檢測生成的隨機數是否有重複,如果取出來的數字和已取得的數字有重複就重新隨機獲取。

random ra=new random(unchecked((int)datetime.now.ticks));

int arrnum=new int[10];

int tmp=0;

int minvalue=1;

int maxvalue=10;

for (int i=0;i<10;i++)

public int getnum(int arrnum,int tmp,int minvalue,int maxvalue,random ra)

n++;

}return tmp;

Random快速連續產生相同隨機數的解決方案

random快速連續產生相同隨機數的解決方案 第一種方式 使用datetime.now.ticks生成隨機數 優缺點 如果觸發random函式間隔時間很短,就有可能造成產生一樣的隨機數 第二種方式 使用thread.sleep 在每次迴圈產生隨機數前延遲幾個毫秒,防止由於計算機運算速度過快,產生偽隨...

c c 隨機數產生相同解決方案

謹記srand 不要呼叫兩次或兩次以上。void main for int i 0 i 10 i srand unsigned time null cout 這樣呼叫的時候,因為cpu高速的關係,呼叫的srand unsigned time null 生成的種子數一樣。導致rand 產生的隨機數也一...

解決for迴圈裡面產生相同隨機數的問題

一般使用random ra new random 就可以。但是如果應用在乙個for迴圈中,取到的多個隨機值就基本相同了。原因如下 用系統時間做隨機種子並不保險,如果應用程式在乙個較快的計算機上執行,則該計算機的系統時鐘可能沒有時間在此建構函式的呼叫之間進行更改,random 的不同例項的種子值 可能...