【问题标题】:Why random method in for statement return the same result? [duplicate]为什么 for 语句中的随机方法返回相同的结果? [复制]
【发布时间】:2012-08-09 19:22:51
【问题描述】:

可能重复:
Random number generator not working the way I had planned (C#)

我有一个返回 9 位字符串数字的方法,如果我调用此方法,它会按预期正常工作,但当我在循环语句中调用它时不会,因为它只生成一个数字并重复它。

代码如下:

private string GenerateRandomNumber()
        {
            Random r = new Random();
            return r.Next(111111111, 999999999).ToString();
        }
        protected void btnSolo_Click(object sender, EventArgs e)
        {
            Response.Write(GenerateRandomNumber());
            // Every time I call this method , it return 9 digit random number wich is different with the previous call like : 146956595  
        }
        protected void btnBulk_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < 100; i++)
            {
                string randomNumber = GenerateRandomNumber();
                Response.Write("<br /> " + randomNumber);
                //It  create just one 9 digit number 100 times !
            }
        }

【问题讨论】:

标签: c# .net random


【解决方案1】:

使Random r = new Random();在类级别完成,并将r保存为类变量。对Next 的后续调用不会生成相同的“随机”值。

private static Random r = new Random();

private string GenerateRandomNumber()
{
    return r.Next(111111111, 999999999).ToString();
}

protected void btnSolo_Click(object sender, EventArgs e)
{
    Response.Write(GenerateRandomNumber());
}

protected void btnBulk_Click(object sender, EventArgs e)
{
    for (int i = 0; i < 100; i++)
    {
        string randomNumber = GenerateRandomNumber();
        Response.Write("<br /> " + randomNumber);
    }
}

【讨论】:

  • 如果在短时间内创建了不同的类实例,甚至可以创建随机变量static
【解决方案2】:

GenerateRandomNumber() 方法使用系统时钟作为种子。

也就是说,它对系统时钟的当前值执行复杂的计算,因为真正的随机性在计算机上是不可能的。问题是 CPU 速度如此之快,以至于您可能正在运行循环并获得相同的值,因为时间几乎没有改变(如果有的话)。尝试循环进行更多迭代,看看会发生什么,最终随机值应该会改变。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-15
    • 2017-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多