我提供了一个简单的代码,它将输出0到100之间的10个随机数字。当我使用F5在visual studio(C#)中运行时,我获得相同的数字10次。但是,如果我通过调试模式,使用F10或F11逐行运行它,我得到10个不同的数字(可能不是全部不同,但它们是随机的)。
public static void rand() {
for (int j = 0; j < 10; j++) {
Random r = new Random();
Console.WriteLine( r.Next(100));
}
}
我知道如何解决这个问题,即通过在循环外部实例化Random r并通过引用进行复制,但我想了解为什么会发生这种情况。我认为这与种子有关但程序在调试模式下运行时会起作用,这让我很困惑。
另外,现在我在质疑我是否总是需要测试调试模式是否能给我正确的结果。
答案 0 :(得分:9)
您应该在循环之前创建Random
个实例。
public static void rand() {
Random r = new Random();
for (int j = 0; j < 10; j++) {
Console.WriteLine(r.Next(100));
}
}
而here的解释是:
<强> ... 默认种子值源自系统时钟并具有有限的分辨率。因此,通过调用默认构造函数紧密连续创建的不同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));
}
}
回答你的问题: ...如果我总是需要测试调试模式是否能给我正确的结果。
不,您不需要怀疑调试模式的结果。他们是对的。错误可能是你对它们的理解。