2012-10-09 49 views
0

可能重複:
Random number generator only generating one random number爲什麼不創建一個「真正的」隨機數?

我試着去創建一個循環來創建和輸出5個隨機數在列表框中。基本上它輸出5次相同的隨機數,而不是5次。當我使用中斷點並通過代碼時,它實際上會生成5個數字。那爲什麼它只輸出第一個答案?謝謝。 (這不是整個項目,但我需要首先得到這個工作)。

public string Numbertext1; 
    public string Numbertext2;  
    public int GeneratedNumbers; 
    public int Average = 0; 
    public int TotalSum = 0; 
    public int TotalCalcs = 0; 
    public int Counter = 0; 

    private void btnRandomise_Click(object sender, EventArgs e) 
    { 
     Numbertext1 = txtNum1.Text; 
     int Number1; 
     int.TryParse(Numbertext1, out Number1); 
     Numbertext2 = txtNum2.Text; 
     int Number2; 
     int.TryParse(Numbertext2, out Number2); 

     do 
     { 

      Random num = new Random(); 
      int number = num.Next(Number1, Number2); 
      lbNumbers.Items.Add(Convert.ToString(number)); 
      Counter++; 
     } 
     while (Counter < 5); 
     { 
      TotalCalcs++; 
      Counter = 0; 
     } 


    } 
} 
} 
+1

這是一個非常常見的問題(參見[C#FAQ](http://stackoverflow.com/tags/c%23/info))。請確保您花時間查看您的問題是否曾被問過。 –

+1

在while(Counter <5)'行之後,我將不得不質疑你對括號的使用。 –

+0

@IchabodClay它是*技術*法律語法;-)(有很多*額外*問題/即將到來的問題,如無用的成員變量。) – 2012-10-09 01:10:57

回答

6

您需要在全局級別初始化您的num變量。它一遍又一遍地使用相同的種子。

把這個:Random num = new Random();在你正在初始化其他東西的頂部。然後從您的方法中刪除它。

3

這是因爲你正在一個緊密循環中創建一個新的Random實例,所以種子數將是相同的。 Random類不是真正的隨機(在數學意義上),所以你應該改變種子或使用它的一個實例。使用其他變量將Random num = new Random();移至頂部。

+0

謝謝你KeyboardP它的工作原理 –

2

因爲你沒有足夠的種子隨機數發生器。

該生成器有一個算法如下,如果你只是創建它沒有播種它,那麼你的號碼將是每次相同。 To quote from MSDN

默認的種子值是從系統時鐘導出的並具有有限的分辨率。因此,通過對默認構造函數的調用而緊密連續創建的不同Random對象將具有相同的默認種子值,因此將生成相同的隨機數集合。

爲了解決這個問題使用其他構造函數允許你指定一個種子 - 有這個MSDN上good example

0

Random類實例化是時間相關的。通過一個非常快速的循環,您每次都創建相同的對象,因此您一次又一次地獲得相同的值。您需要在循環外部移動實例,以便在撥打Next()時獲得新的號碼。

這也是爲什麼當你使用斷點檢查值時「起作用」的原因。您創建的隨機對象將具有不同的參考時間,因此會有所不同。