2011-04-25 103 views
1

我一直在玩耍,寫下這段小小的代碼。我試圖翻轉定義次數的硬幣,然後計算我得到的尾數和頭數。所以這裏是:翻轉硬幣問題

private void Start_Click(object sender, EventArgs e) 
{ 
    int headss = 0; 
    int tailss = 0; 
    int random2, g; 
    string i = textBox1.Text; 
    int input2, input; 
    bool NumberCheck = int.TryParse(i, out input2); 

    if (textBox1.Text == String.Empty) // check for empty string, when true 
     MessageBox.Show("Enter a valid number between 0 and 100000."); 
    else // check for empty string, when false 
     if (!NumberCheck) // number check, when false 
     { 
      textBox1.Text = String.Empty; 
      MessageBox.Show("Enter a valid number between 0 and 100000."); 
     } 
     else 
     { 
      input = Convert.ToInt32(textBox1.Text); 

      for (g = 0; g < input; g++) 
      { 
       Random random = new Random(); 
       random2 = random.Next(2); 

       if (random2 == 0) 
       { 
        headss++; 
       } 
       else if (random2 == 1) 
       { 
        tailss++; 
       } 
      } 
     } 

    heads.Text = Convert.ToString(headss); 
    tails.Text = Convert.ToString(tailss); 
} 

問題是,我一直顯示內容時出現問題。它甚至不會顯示出正確的結果。有任何想法嗎?

編輯。解決方案:移動以下行3行了:d

Random random = new Random(); 
+4

顯示器看起來不錯,但翻轉並不好。 「隨機」的默認種子基於系統時鐘,其分辨率不是很好。通過在循環中每次創建一個新的'Random'對象,您將在許多迭代中反覆得到相同的種子,因此您的翻轉將不會非常隨意。 – mquander 2011-04-25 05:47:41

回答

5

而不是

for (g = 0; g < input; g++) 
{ 
    Random random = new Random(); 
    random2 = random.Next(2); 
} 

聲明一個Random使用全:

private Random randomGenerator = new Random(); 
private void Start_Click(object sender, EventArgs e) 
{ 
    // ... 
    for (g = 0; g < input; g++) 
    { 
     random2 = randomGenerator.Next(2); 
    } 
    // ... 
} 
+0

謝謝。這爲我工作。他們之間有什麼表現差異? – HelpNeeder 2011-04-25 05:57:52

+0

這種新方式更好,但可能無法衡量。 – bendewey 2011-04-25 06:01:25

+1

作爲一個經驗法則,你會說反覆重建一個對象比重用一個對象要慢嗎? – 2011-04-25 06:43:25

4

(默認隨機確實好)你應該只使用一個隨機的對象產生良好的隨機序列。

+0

敏銳的眼睛:)謝謝你,現在工作。 – HelpNeeder 2011-04-25 05:48:58

2

隨機的默認構造函數以systmem時間爲種子。因此,如果您在很短的時間內生成大量的這些數據,它們將生成相同的隨機數序列。將隨機對象從循環中拉出並且不會發生這種效果。

0

隨着RandomGenerator。此代碼將計算硬幣翻轉的次數。它將以3個連續的HEADS結束。

private RandomGenerator rgen = new RandomGenerator(); 

public void run() { 

    int value = 0; 
    int total = 0; 
    while (value != 3) { 
     String coinFlip = rgen.nextBoolean() ? "HEADS" : "TAILS"; 
     println (coinFlip); 
     if (coinFlip == "HEADS") { 
      value+=1; 
     } else { 
      value=0; 
     } 
     total +=1; 
    } 
    println ("It took "+total+" flips to get 3 consecutive heads");  
}