2011-04-03 78 views
1

可能重複:
Why does it appear that my random number generator isn't random in C#?
Random number generator not working the way I had planned (C#)隨機化數字不起作用

你好,
我用這個函數(類)以隨機數字:

private int RandomNumber(int min, int max) 
{ 
    Random random = new Random(); 
    return random.Next(min, max); 
} 

public void Init() 
{ 
    x = RandomNumber(0,500); 
} 

但是如果我再打多個對象做到這一點:

Obj[] obj = new Obj[64]; 
for(int i = 0 ; i < 64 ; i++) 
{ 
    obj[i] = new Obj(); 
} 
... 
for(int i = 0 ; i < 64 ; i++) 
{ 
    obj[i].Init(); 
} 

然後每個對象都有完全相同的「x」值。

這裏有什麼問題?

+0

這裏是一個更好的重複與線程安全的答案:http://stackoverflow.com/questions/767999/random-number-generator-not-working-the-way-i-had-planned-c – 2011-04-03 19:45:31

回答

5

Random應該只創建一次而Next在單個實例上調用。

這是因爲默認情況下Random是在當前時間播種 - 如果在緊密循環中調用(就像你一樣),種子將是相同的,並且僞隨機算法的結果將大部分相同。

如果你改變你的代碼,這樣的事情,你會得到更好的效果:

private static Random random = new Random(); 
private int RandomNumber(int min, int max) 
{ 
    return random.Next(min, max); 
} 

然而,這是不是線程安全的。如果您嘗試在多線程應用程序中使用它,則會出現問題。對於線程安全版本,我建議閱讀並遵循Jon Skeet撰寫的this文章。

+0

現在效果很好,非常感謝! – Neomex 2011-04-03 18:45:20

+1

使用純靜態變量來存儲對「Random」實例的引用不是一個好主意,因爲它不是線程安全的。有關更多詳細信息,請參閱http://csharpindepth.com/Articles/Chapter12/Random.aspx。 – 2011-04-03 18:56:33

+0

@Jon - 感謝您的糾正。 – Oded 2011-04-03 19:00:03

2

隨機類是一個僞隨機數發生器。它需要一個獨特的種子價值來產生獨特的數字。

默認種子值基於當前時間,因爲您的所有對象都是在瞬間創建的,所以它們是相同的。

使隨機實例成爲靜態或爲每個實例化找到唯一的種子值以解決問題。

+0

看到我對Ode​​d的答案的評論 - 使用簡單的靜態變量是一個*糟糕的*解決方案。 – 2011-04-03 18:57:37