gpt4 book ai didi

c# - 如果我在每个循环之间按 ENTER 键,为什么随机生成和数组会一起工作?

转载 作者:行者123 更新时间:2023-12-03 22:02:58 24 4
gpt4 key购买 nike

只要我在代码中有 readkey,最终结果就是 7 个不同的随机循环(foreach)。当我删除 readkey 时,我大多会得到 7 个相同的数字(foreach)。

这导致我开始尝试 Task.Delay,但似乎没有什么区别。我认为这可能是一个计时问题,因为 7 个随机数中的第一个会间歇性地与最后 6 个不同。

我希望代码可以一次性运行,而无需按任何键。如果这篇文章的格式不可靠,我深表歉意。我在这个输入窗口中按ENTER键的经历很糟糕。

int[] tray = new int[7];

for (int i = 0; i < tray.Length; i++)
{
Random rnd = new Random();
int randomNumber = rnd.Next(1, 26);
//Task.Delay(9000);
tray[i] = randomNumber;
Console.WriteLine("randomNumber {0} is {1} ENTER ", i + 1, tray[i]);
//Task.Delay(9000);
Console.ReadKey();
}
foreach (var number in tray)
{
Console.WriteLine(number);
}

最佳答案

这是因为您正在循环内初始化Random。将声明移到循环之外,您应该获得随机值。像:

Random rnd = new Random();
for (int i = 0; i < tray.Length; i++)
{
int randomNumber = rnd.Next(1, 26);
//Task.Delay(9000);
tray[i] = randomNumber;
Console.WriteLine("randomNumber {0} is {1} ENTER ", i + 1, tray[i]);
}

当循环中有Random时,它使用系统时钟作为种子。如果没有 Console.ReadKey,每次迭代最终都会使用相同的种子,因为迭代中的工作量非常少。因此,Random (rnd) 最终每次都会使用相同的种子。一旦您引入了 Console.ReadKey,这将更改种子,因此您会看到不同的结果。

还有一件事是,您尝试了 Task.Delay 但没有看到任何差异。原因是 Task.Delay 不会阻塞线程,因此下一次迭代的时钟时间没有变化。仅出于测试目的,您可以使用:

Task.Delay(1000).Wait();

或者

Thread.Sleep(1000);

这将导致线程被阻塞近一秒钟,并且最终会得到不同/随机的结果。

更好的方法是在循环外初始化Random

关于c# - 如果我在每个循环之间按 ENTER 键,为什么随机生成和数组会一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37302232/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com