【问题标题】:Why doesn't this create a "true" random number? [duplicate]为什么这不会创建一个“真正的”随机数? [复制]
【发布时间】:2012-09-29 06:37:20
【问题描述】:

可能重复:
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;
        }


    }
}
}

【问题讨论】:

  • 这是一个非常常见的问题(见C# FAQ)。请确保您花时间查看您的问题之前是否有人问过。
  • 我将不得不质疑您在 while (Counter &lt; 5) 行之后使用括号。
  • @IchabodClay 这是技术上合法的语法;-)(还有许多附加问题/即将出现的问题,例如无用的成员变量。)跨度>

标签: c# random numbers


【解决方案1】:

您需要在全局级别初始化您的 num 变量。它一遍又一遍地使用同一个种子。

把这个:Random num = new Random(); 放在你初始化其他所有东西的顶部。然后从你的方法中删除它。

【讨论】:

    【解决方案2】:

    这是因为您在紧密循环中创建了一个新的 Random 实例,因此种子编号将是相同的。 Random 类并不是真正随机的(在数学意义上),因此您应该更改种子或使用它的一个实例。将Random num = new Random(); 与其他变量一起移到顶部。

    【讨论】:

      【解决方案3】:

      因为您没有为随机数生成器提供足够的种子。

      生成器有一个它遵循的算法,如果你只是创建它而不播种它,那么你的数字每次都是一样的。 To quote from MSDN:

      默认种子值来自系统时钟并且具有有限的分辨率。因此,通过调用默认构造函数连续创建的不同 Random 对象将具有相同的默认种子值,因此将产生相同的随机数集。

      要解决此问题,请使用允许您指定种子的其他构造函数 - MSDN 上有一个 good example

      【讨论】:

        【解决方案4】:

        Random 类实例化是时间相关的。通过一个非常快速的循环,您每次都在创建相同的对象,因此您会一遍又一遍地获得相同的值。您需要将实例移出循环,以便在调用 Next() 时获得新数字。

        这也是使用断点检查值时它“起作用”的原因。您创建的 Random 对象将具有不同的参考时间,因此会有所不同。

        【讨论】:

          猜你喜欢
          • 2012-01-08
          • 2011-05-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-26
          • 1970-01-01
          相关资源
          最近更新 更多