C# 为什么for语句中的随机方法返回相同的结果?

C# 为什么for语句中的随机方法返回相同的结果?,c#,.net,random,C#,.net,Random,可能重复: 我有一个方法,它返回9位的字符串数字,如果我调用这个方法,它会像我预期的那样正常工作,但在循环语句中调用它时不会,因为它只生成一个数字并重复它 代码如下: private string GenerateRandomNumber() { Random r = new Random(); return r.Next(111111111, 999999999).ToString(); } pr

可能重复:

我有一个方法,它返回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 !
            }
        }
private string GenerateRandomNumber()
{
随机r=新随机();
返回r.Next(1111111119999999).ToString();
}
受保护的void btonsolo\u单击(对象发送方,事件参数e)
{
Write(GenerateRandomNumber());
//每次调用此方法时,它都返回9位随机数,这与以前的调用不同,如:146956595
}
受保护的无效btnBulk_单击(对象发送者,事件参数e)
{
对于(int i=0;i<100;i++)
{
字符串randomNumber=GeneratorAndomNumber();
响应。写入(“
”+随机数); //它只创建一个9位数的数字100次! } }
GenerateRandomNumber()方法使用系统时钟作为种子


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

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

private static Random r=new Random();
私有字符串生成器域编号()
{
返回r.Next(1111111119999999).ToString();
}
受保护的void btonsolo\u单击(对象发送方,事件参数e)
{
Write(GenerateRandomNumber());
}
受保护的无效btnBulk_单击(对象发送者,事件参数e)
{
对于(int i=0;i<100;i++)
{
字符串randomNumber=GeneratorAndomNumber();
响应。写入(“
”+随机数); } }
这个问题解释了为什么:如果在短时间内创建了类的不同实例,甚至可以将随机变量
设置为静态。
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);
    }
}