2011-06-09 146 views
-1

可能重複:
Why is Random class isn't really random?隨機類不會創建隨機數?

我有以下類型的代碼:

public static int GenerateRandomNumber(int seed) 
{ 
    var random = new Random(seed);     
    int num = random.Next(); 
    while(num.ToString().Length != 6){ 
     num = random.Next(); 
    } 
    return num; 
} 

我想每次當調用這個函數,即使相同的種子時間得到不同數量。但我總是得到相同的結果。 例如,每次撥打電話GenerateRandomNumber(1),我總是得到號碼640839.

如何解決這個問題?

+3

真的很糟糕的方式來創建6位數的隨機數。使用'Next(100000,1000000)'代替 – Dyppl 2011-06-09 20:01:46

+0

'Random.Next()'是重載的。 [您可以傳入兩個整數](http://msdn.microsoft.com/en-us/library/2dx6wyd4.aspx)指定返回的數字應在的範圍內。 – unholysampler 2011-06-09 20:02:29

+0

什麼是長度6有關?你真的打算循環? – Andrei 2011-06-09 20:02:31

回答

6

這裏是你的問題:

var random = new Random(id); 

Random產生僞隨機的結果集 - 在相同的種子,你會每次都得到相同的序列。

更改創建Random對象的靜態字段,只要你把它你會得到不同的結果。

從MSDN - Random Class

從種子值的隨機數生成開始。如果重複使用相同的種子,則生成相同的一系列數字。

0

Random根據稱爲種子的初始值(代碼中的id)創建一系列僞隨機數。

由於種子是相同的,所以對函數的所有調用都將遵循相同的代碼路徑並生成相同的結果。

充分利用random = new Random(seed)一個靜態變量在函數或使其包含類的成員,並把它傳遞給需要它的所有功能/班。

當您完成開發程序時,請考慮使用基於時間的種子值。

0

我想每次調用此函數時都會得到不同的數字,即使使用相同的種子。

這不是種子是如何工作的。種子的全部要點是使用相同的種子將產生相同的一系列僞隨機數。該系列是確定性的

12

我希望每次調用此函數時都會得到不同的數字,即使使用相同的種子。

自認爲是相反的what the Random constructor is documented to do,你將不得不學會與失望。你不能總是得到你想要的。

+4

...但是如果你嘗試...... – 2011-06-09 21:18:55

0

你需要解決的問題是使與product specifications您的期望:

提供相同的種子值 不同的隨機對象使每個 情況下產生的隨機數相同 序列。

因此,要麼期望從種子的相同序列,要麼不使用種子。