【问题标题】:Not jumping into code while not debugging [duplicate]不调试时不跳入代码[重复]
【发布时间】:2020-02-01 12:52:21
【问题描述】:
for (int i = 1; i < 10; i++)
{
  number = randomNumber();
  if (!straightLine.Contains(number))
  {
     straightLine.Add(number);
  }

}

public static int randomNumber()
{
    Random random = new Random();
    return random.Next(1, 100);
}

当我调试时它工作正常,但是当我运行程序时它会得到 1 个随机数,仅此而已。所以问题是随机数方法只被调用一次(当我不调试时它每次都会调用它)

我能做什么?

【问题讨论】:

  • 是的,我尝试了打印整个循环的所有内容,当我调试它时,它可以正常工作,否则它只会在第一次得到一个数字并坚持下去:(

标签: c# loops debugging methods


【解决方案1】:

germi 的回答有点误导,因为它暗示新 Random 的任何重复实例化都会产生相同的值序列。这不太正确,因为您的调试代码按预期工作。

Random 的文档说,如果您不传递种子值,则随机数生成器是从系统时钟播种的。 https://docs.microsoft.com/en-us/dotnet/api/system.random.-ctor?view=netframework-4.8

它在调试中起作用的原因是调试代码非常慢(实际上,您一次需要数百毫秒来单步执行代码)并且时钟有时间在循环运行之间进行更改。

当您的代码全速运行时,它运行得如此之快,以至于系统时钟根本不会更改为新的毫秒值,因此您重复制作新的 Random 将导致它被播种为相同的值时钟

如果您要在代码中插入一些延迟,例如循环中的 Thread.Sleep(1000),那么它会起作用。如果您要运行循环一百万次,则需要足够长的时间才能完成时钟最终会改变 - 一百万次迭代可能需要足够长的时间才能让少数值从随机中出来

解决方案的建议是合理的;在循环之外的某个地方创建一个新的 Random 然后重复调用它。您也可以使用每次唯一的东西(例如 i 的值)为 Random 播种,但您应该记住,提供特定的种子将保证在调用 Next 时会产生相同的随机数。在某些情况下,这很有用,因为您可能想要一种情况,即您可以提供某个值,然后看到相同的随机数序列出现。需要注意的主要事情是,默认情况下,Random 根据时钟启动它的序列;如果在创建 Random 时它们的时钟读数相同,则具有不同时间设置的两台不同的计算机理论上可以产生相同的随机数。

【讨论】:

    【解决方案2】:

    重复实例化一个新的Random 实例将导致生成相同的数字,因为种子将是相同的。

    解决方案是在生成值的类中有一个Random 实例:

    var random = new Random();
    for (int i = 1; i < 10; i++)
    {
        number = random.Next(1,100);
        if (!straightLine.Contains(number))
        {
            straightLine.Add(number);
        }
    }
    

    请注意,此行为仅存在于 .NET Framework 中,即使在快速连续创建的多个 Random 实例中,.NET Core 也会产生不同的值。

    【讨论】:

    • 感谢这个帮助 :)
    • .Net 核心表现不同的有趣细节
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-19
    • 1970-01-01
    • 2016-06-04
    • 1970-01-01
    • 2013-12-19
    相关资源
    最近更新 更多