C# 不调试时不跳入代码 for(int i=1;i
当我调试时,它工作正常,但当我运行程序时,它会得到1个随机数,仅此而已。所以问题是随机数方法只被调用一次(当我不调试时,它每次都会调用)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
我能做什么?重复实例化一个新的
随机
实例将导致生成相同的数字,因为种子将是相同的
解决方案是在生成值的类中有一个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);
}
}