2011-12-08 111 views
2

可能重複:
Random number generator not working the way I had planned (C#)
Why does it appear that my random number generator isn't random in C#?相同的隨機值

我有問題的隨機值

 int weight = 0; 
     Random random = new Random(); 
     for (int i = 0; i < entriesCount; i++) 
     { 
      weight = random.Next(10); 
     this.weights[i] = weight; 
     } 

此代碼是我對象的構造函數。我創建3個不同的對象

Object object1 = new Object(2); 
Object object2 = new Object(2); 
Object object3 = new Object(2); 

對於每個對象,我會得到相同的隨機值,例如:4,5 | 4,5 | 4,5

每次我以相同的順序得到相同的值。我不`噸明白爲什麼>請幫

最好的問候, 的Dawid

+0

下面是一些關於這個問題好讀:http://csharpindepth.com/Articles/Chapter12/Random.aspx – Oded

+0

看到這裏的解釋:創建一個隨機對象,而不是多個(HTTP:// MSDN .microsoft.com/en-us/library/system.random.aspx) – Smash

回答

3

問題是你每次都要創建一個新的Random。當您創建Random類的實例時,它將當前時間用作種子。如果您多次執行此操作,您會得到相同的種子值,因此不同的隨機實例會輸出相同的結果。

爲了解決這個問題,您需要確保您的隨機播種單獨播種,或者共享並使用一個隨機實例。最簡單的選擇是僅使隨機實例靜態:

class YourClass 
{ 
    private static Random randomGenerator = new Random(); 

    public YourClass(int entriesCount) 
    { 
     int weight = 0; 
     for (int i = 0; i < entriesCount; i++) 
     { 
      weight = randomGenerator.Next(10); 
      this.weights[i] = weight; 
     } 
    } 
    // .. rest of your class 

這將導致該類總是重複使用相同的隨機實例,所以你每次得到不同的值。

請注意,如果你打算在多線程場景中使用它,你還必須同步對隨機實例的訪問,或者提出一種不同的方法(例如保存種子值和使用像Interlocked.Increment增加它並從每個實例種下一個新的隨機,等等)。

+0

非常感謝。它的作品完美! – Fixus

0

隨機是一個僞隨機數發生器,這意味着輸出的順序爲任何給定的種子一樣。如果將種子傳遞給構造函數,則會得到不同的順序。

0

據我所知,一個隨機是由系統時間播種,除非你另有指定。它根據這個數字生成數字。當你幾乎完全同時創建它們時,它們具有相同的種子,並且幾乎總是返回相同的數字和序列。

任何簡單的修復方法都是創建一個靜態隨機所有實例共享,並且只需調用該靜態對象上的.Next()。

0

MSDN documentation

「使用參數構造緊密相繼創建產生的隨機數相同的序列隨機數生成器來創建不同的隨機的對象」