运行程序给出了与调试模式不同的结果

Cha*_*Han 8 c# random debugging

我提供了一个简单的代码,它将输出10个随机数字,介于0和100之间.当我在Visual Studio(C#)中使用F5运行时,我获得相同的数字10次.但是,如果我通过调试模式,使用F10或F11逐行运行它,我得到10个不同的数字(可能不是全部不同,但它们是随机的).

public static void rand() {
    for (int j = 0; j < 10; j++) {
        Random r = new Random();
        Console.WriteLine( r.Next(100));
    }   
}
Run Code Online (Sandbox Code Playgroud)

我知道如何解决这个问题,这是通过在循环外部实例化Random r并通过引用进行复制,但我想了解为什么会发生这种情况.我认为这与种子有关但程序在调试模式下运行时会起作用,这让我很困惑.

此外,现在我正在质疑我是否总是需要测试调试模式是否给我正确的结果.

Dmy*_*tro 9

您应该Random在循环之前创建实例.

public static void rand() {
    Random r = new Random();
    for (int j = 0; j < 10; j++) {        
        Console.WriteLine(r.Next(100));
    }   
}
Run Code Online (Sandbox Code Playgroud)

这里的解释:

...默认种子值来自系统时钟并具有有限的分辨率.因此,通过调用默认构造函数紧密连续创建的不同Random对象将具有相同的默认种子值,因此将生成相同的随机数集.使用单个Random对象生成所有随机数可以避免此问题....

如果要使用不同的Random实例,则应使用不同的seed值.例如j变量:

public static void rand()
{
     for(int j = 0; j < 10; j++)
     {
          Random r = new Random(j);
          Console.WriteLine(r.Next(100));
     }
}
Run Code Online (Sandbox Code Playgroud)

回答你的问题: ...如果我总是需要测试调试模式是否能给我正确的结果.

不,你不需要怀疑调试模式的结果.他们是对的.错误可能是你对它们的理解.

  • 如果你用Reflector查看它就是Random构造函数的样子:`public Random():this(Environment.TickCount){}` (8认同)