Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 不调试时不跳入代码 for(int i=1;i_C#_Loops_Debugging_Methods - Fatal编程技术网

C# 不调试时不跳入代码 for(int i=1;i

C# 不调试时不跳入代码 for(int i=1;i,c#,loops,debugging,methods,C#,Loops,Debugging,Methods,当我调试时,它工作正常,但当我运行程序时,它会得到1个随机数,仅此而已。所以问题是随机数方法只被调用一次(当我不调试时,它每次都会调用) 我能做什么?重复实例化一个新的随机实例将导致生成相同的数字,因为种子将是相同的 解决方案是在生成值的类中有一个Random实例: for (int i = 1; i < 10; i++) { number = randomNumber(); if (!straightLine.Contains(number)) { straight

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


我能做什么?

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

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

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);
}
var random=new random();
对于(int i=1;i<10;i++)
{
数字=随机。下一个(1100);
如果(!直线包含(编号))
{
直线。加(数);
}
}

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

Germ的回答有点误导,因为它意味着新随机的任何重复实例化都会产生相同的值序列。这并不完全正确,因为您的调试代码按预期工作

Random的文档中说,如果不传递种子值,则随机数生成器将从系统时钟中种子化

它在debug中工作的原因是调试代码非常慢(一行一行地调试代码实际上需要数百毫秒),并且时钟在循环的两次运行之间有时间改变

当您的代码以全速运行时,它运行得如此之快,以至于系统时钟根本不会更改为新的毫秒值,因此重复生成新的随机数将导致使用时钟中的相同值对其进行播种

如果要在代码中插入一些延迟,比如在循环中插入Thread.Sleep(1000),那么它就可以工作了。如果你运行循环一百万次,它将花费足够长的时间来工作,时钟最终会改变-一百万次迭代可能需要足够长的时间,以使一小部分值从随机循环中出来


不过,关于解决方案的建议是合理的;在循环之外的某个地方创建一个新的随机变量,然后重复调用它。您还可以使用每次都是唯一的东西(比如i的值)为随机数播种,不过您应该记住,提供特定的种子将保证在下次调用时从中产生相同的随机数。在某些情况下,这是很有用的,因为您可能需要这样一种情况:您可以提供一个特定的值,然后看到相同的随机数序列出现。需要注意的主要事情是,默认情况下,随机启动基于时钟的序列;两台具有不同时间设置的不同计算机理论上可以产生相同的随机数,前提是它们的时钟在创建随机数时读取的读数相同。

是的,我尝试了所有方法打印整个循环,当我调试它时,我希望它能正常工作,但第一次只得到一个数字并坚持:(thx this helpt:)有关.Net内核行为不同的有趣细节
var random = new Random();
for (int i = 1; i < 10; i++)
{
    number = random.Next(1,100);
    if (!straightLine.Contains(number))
    {
        straightLine.Add(number);
    }
}