【问题标题】:Flip a coin problem抛硬币问题
【发布时间】:2011-04-25 05:42:28
【问题描述】:

我一直在玩耍并编写了这段小代码。我正在尝试将硬币翻转定义的次数,然后计算我得到了多少个反面和正面。所以这里是:

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();

【问题讨论】:

  • 显示看起来不错,但翻转不好。 Random 的默认种子是基于系统时钟的,其分辨率不是那么好。通过在循环中每次创建一个新的Random 对象,您将在多次迭代中一遍又一遍地获得相同的种子,因此您的翻转不会很随机。

标签: c# coin-flipping


【解决方案1】:

代替

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);
    }
    // ...
}

【讨论】:

  • 谢谢。这对我有用。它们之间是否存在性能差异?
  • 这种新方法更好,但可能无法衡量。
  • 根据经验,你会说一遍又一遍地重新创建一个对象比重用一个对象要慢吗?
【解决方案2】:

您应该只使用一个 Random 对象来生成好的(与默认的 Random 一样好)随机序列。

【讨论】:

    【解决方案3】:

    random 的默认构造函数以系统时间为种子。因此,如果您在短时间内生成大量它们,它们都会生成相同的随机数序列。将随机物体拉出循环,不会出现这种效果。

    【讨论】:

      【解决方案4】:

      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");     
      }
      

      【讨论】:

        猜你喜欢
        • 2011-04-04
        • 2011-09-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-09
        • 2014-05-25
        • 1970-01-01
        相关资源
        最近更新 更多