2010-09-12 119 views
2

好的,所以我使用int indexSelector = RandomNumber(1, 14);創建一個隨機數並從數組中拉出匹配的索引。但它似乎只能撥打3或4個號碼。像被拉出的物品非常相似。C#隨機數

怎麼回事?

+6

這是什麼'RandomNumber'函數? BCL中沒有這樣的功能,所以不要指望我們知道它的作用,以及爲什麼它返回相同的數字。 – 2010-09-12 19:27:02

+1

你可以給出一個完整的代碼清單,包括你的RandomNumber方法 – 2010-09-12 19:28:40

+3

RandomNumber不是一個方法的好名字。你至少應該命名爲「GetRandomNumber」 – 2010-09-12 19:29:37

回答

9

聽起來好像你正在調用一個函數,在每次調用時重新創建一個Random對象。 不要在每次函數調用時重新創建Random對象。

所以做這樣的事情:

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

每布賴恩的建議,某處定義Random對象,它不會重新創建:

Random r = new Random(); 

,並以此來獲得數:

int indexSelector = r.Next(1, 14); 
2

使您的隨機變量爲靜態:

static Random random = new Random(); 
+0

如果它是在調用RandomNumber的「每個」時間構造的,那麼使它成爲靜態不會產生任何影響。靜態只讀,你有所作爲 – 2010-09-12 20:13:50

+0

@Rune:有一個初始化實例,我們可以假設每次都沒有被替換。 – 2010-09-12 20:54:41

+0

請注意,Random類的方法不是線程安全的,因此將其用作靜態變量將需要鎖定。 – tia 2010-09-13 02:05:55

0

Random如果由相同的種子提供,總是返回數字的相同的序列。我建議你初始化使用隨機種子:

  Random r = new Random(Environment.TickCount); 

甚至更​​好:

  Random r2 = new Random(BitConverter.ToInt32(Guid.NewGuid().ToByteArray(), 0)); 

這可以確保您創建一個真正的隨機數序列。如果你沒有發送種子,系統將使用一個時間依賴的種子,如果你一個接一個地創建它們,它將是相同的。

+0

不能保證Guid的前四個字節是一個好種子。你的第一個建議正是「Random」的默認構造函數目前的工作原理。因此遭受同樣的問題:種子每隔幾毫秒就會改變一次。 – CodesInChaos 2011-07-16 08:23:28

+0

我應該從數學上證明GUID更好嗎? – Aliostad 2011-07-16 16:18:37

+0

GUID生成器只嘗試實現唯一性。它並不能保證GUID部分的良好分佈。雖然當前在窗口上實施GUID確實基於高質量的隨機數,但沒有合約義務保持這種狀態。 http://blogs.msdn.com/b/oldnewthing/archive/2008/06/27/8659071。aspx – CodesInChaos 2011-07-16 16:50:38