2011-02-11 34 views
3

我使用的方法來創建兩個新int陣列,隨機數, 但兩個數組包含完全相同的號碼。這是爲什麼發生?爲什麼我的隨機數字生成器爲兩個數組都使用相同的數字?

static void Main(string[] args) 
    { 
     int[] Foo1= Foo(1000); 
     int[] Foo2= Foo(1000); 
    } 
    static int[] Foo(int length) 
    { 
     int[] Array = new int[length]; 
     Random r = new Random(); 
     for (int i = 0; i < length; i++) 
     {   
      Array[i]=r.Next(1, 101); 
     } 
     //Thread.Sleep(6); 
     return Array; 
    } 
+6

天哪,有一個`[怪異行爲]`標籤? – BoltClock 2011-02-11 13:31:03

+0

與2追隨者... @BoltClock有所有樂趣itseems ...;) – 2011-02-11 13:31:55

+1

@BoltClock不長。 – 2011-02-11 13:32:47

回答

6

你不是seeding Random但你可能使用它足夠近調用之間,默認的種子是在兩種情況下是相同的:

默認種子值從 導出系統時鐘和具有有限的 分辨率。因此,通過調用 默認構造函數關閉連續創建的隨機對象將具有 相同的默認種子值,因此, 將產生隨機數的相同集合 。這個問題可以通過使用一個隨機 對象生成所有隨機數進行 避免。 您也可以通過修改 系統時鐘返回的種子值,然後明確地提供 將此種子值提供給 隨機(Int32)構造函數來解決此問題。欲瞭解更多 信息,請參閱隨機(Int32)已 構造。

1

因爲您使用的種子幾乎相同。嘗試在該方法外移動Random r = new Random();

5

那是因爲你的隨機初始化兩次,過小的時間差有不同的種子。

試試這個:

static void Main(string[] args) 
{ 
    Random r = new Random(); 
    int[] Foo1= Foo(1000,r); 
    int[] Foo2= Foo(1000,r); 
} 
static int[] Foo(int length, Random r) 
{ 
    int[] Array = new int[length]; 

    for (int i = 0; i < length; i++) 
    {   
     Array[i]=r.Next(1, 101); 
    } 
    //Thread.Sleep(6); 
    return Array; 
} 
3

這是因爲Random類這不是真正的隨機數,而是僞隨機量的。所以每當一個新的Random實例在短時間內初始化時,它會再次以相同的數字開始。如果時間跨度較大,則會有不同的種子,所以它會起作用。我會建議申報Random比如在Main,並把它交給了Foo方法,所以它看起來像這樣:

static void Main(string[] args) 
{ 
    Random r = new Random(); 
    int[] Foo1= Foo(1000, r); 
    int[] Foo2= Foo(1000, r); 
} 
static int[] Foo(int length, Random r) 
{ 
    int[] Array = new int[length]; 
    for (int i = 0; i < length; i++) 
    {   
     Array[i]=r.Next(1, 101); 
    } 
    //Thread.Sleep(6); 
    return Array; 
} 

編輯:我修改後上方喬恩斯基特的建議代碼。現在他提到的問題應該消失了。

3

可以使用全局Random對象,或者您可以使用一個好的種子一樣

new Random(Guid.NewGuid().GetHashCode()); 
5

圍繞「你使用隨機的兩個實例使用相同的種子」其他的答案是正確的。但是,他們過去使用靜態變量來引用Random的實例。如果您嘗試從多個線程使用它,可能會導致問題,因爲Random不是線程安全的。

對此有各種解決方法(例如,爲每個線程創建一個Random的實例,並使用靜態方法來安全地訪問它) - 我寫了quite a long article on this topic,您可能會發現它有用。

相關問題