2011-04-25 100 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");  
}