【问题标题】:Running a program gives me different results from debugging mode运行程序给了我与调试模式不同的结果
【发布时间】:2013-06-07 05:25:23
【问题描述】:

我提供了一个简单的代码,它将输出 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));
    }   
}

我知道如何解决这个问题,即通过在循环之外实例化 Random r 并通过引用复制,但我想了解为什么会发生这种情况。我认为这与种子有关,但程序在调试模式下运行时确实可以工作,这让我感到困惑。

另外,现在我怀疑我是否总是需要测试调试模式是否给了我正确的结果。

【问题讨论】:

  • 尝试声明你的 Random outside 循环
  • 感谢您的建议,但我已经在帖子中提到了

标签: c# debugging random


【解决方案1】:

您应该在循环之前创建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));
     }
}

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

不,您无需怀疑调试模式的结果。他们是对的。您对它们的理解可能有误。

【讨论】:

  • 如果你用 Reflector 看 Random 构造函数,这就是它的样子:public Random() : this(Environment.TickCount){}
猜你喜欢
  • 2022-01-20
  • 2013-09-08
  • 1970-01-01
  • 1970-01-01
  • 2015-01-28
  • 1970-01-01
  • 2011-09-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多