代码只有在使用调试器单步执行时才能正确运行?
可能重复:
随机数生成器仅生成一个随机数
不久前我对此感到有些困惑。 我有以下代码:
public blockType generateRandomBlock() { Random random = new Random(); int makeBlockOfType = random.Next(0, 100); blockType t = blockType.normal; if (makeBlockOfType = 60) { t = blockType.blue; } else if (makeBlockOfType > 80 && makeBlockOfType 95 && makeBlockOfType <= 100) { t = blockType.green; } return t; }
相当简单,它根据随机生成的数字(基于系统时间)返回enum
值。 不幸的是,由于一些奇怪的原因,我有所有的块都是一种颜色或另一种颜色,即使这是针对每个块进入游戏。 但是,当我使用调试器逐步执行此操作,然后在运行后查看结果时,我看到块现在基于提供的机会多色。 我对为什么会发生这种情况感到有些困惑。
为此,我使用MonoGame,它使用Mono编译器而不是Microsoft编译器。 这可能是问题吗? 我试图将此代码内联到构造函数中,从中调用它但我得到了相同的结果(我猜测编译器无论如何都会内联代码)。
我试图单独重启Visual Studio而不是让运行进行构建; 没有变化。
任何建议和帮助非常感谢!
您应该只将Random实例化一次(将其设置为私有字段并在构造函数中实例化),请参阅类似的问题: Random.Next始终返回相同的值
请参阅随机文档 :
随机数生成从种子值开始。 如果重复使用相同的种子,则生成相同的数字序列
在您的情况下,您创建一个具有相同种子的Random实例(时间太近)并且您获取对于给定种子将是相同的第一个值。
每次调用方法时,您都在重新创建随机数生成器:
public blockType generateRandomBlock() { Random random = new Random();
由于随机数生成器的种子基于时间,这将为连续调用返回相同的值。
将您的生成器创建移出例程:
Random random = new Random(); public blockType generateRandomBlock() {
当您在非常短的时间内连续创建多个Random
实例时,它们可能最终会使用相同的时间相关种子值进行初始化。
要解决此问题,您应该将Random
初始化为实例字段:
上述就是C#学习教程:代码只有在使用调试器单步执行时才能正确运行?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
private readonly Random random = new Random(); public blockType generateRandomBlock() { int makeBlockOfType = random.Next(0, 100); // ... }
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1002238.html