代码只有在使用调试器单步执行时才能正确运行?

时间:2012-12-12 14:15:07

标签: c# mono xna monogame

  

可能重复:
  Random number generator only generating one random number

我刚才有点困惑。我有以下代码:

public blockType generateRandomBlock()
{
    Random random = new Random();
    int makeBlockOfType = random.Next(0, 100);

    blockType t = blockType.normal;
    if (makeBlockOfType <= 80 && makeBlockOfType >= 60)
    {
        t = blockType.blue;
    }
    else if (makeBlockOfType > 80 && makeBlockOfType <= 95)
    {
        t = blockType.orange;
    }
    else if (makeBlockOfType > 95 && makeBlockOfType <= 100)
    {
        t = blockType.green;
    }

    return t;
}

相当简单,它根据随机生成的数字(基于系统时间)返回enum值。不幸的是,由于一些奇怪的原因,我有所有的块都是一种颜色或另一种颜色,即使这是针对每个被放入游戏的块运行。但是,当我使用调试器逐步执行此操作,然后在运行一段时间后查看结果时,我发现块现在根据提供的机会多色。我对为什么会发生这种情况感到有些困惑。

为此,我使用MonoGame,它使用Mono编译器而不是Microsoft编译器。这可能是问题吗?我试图将这段代码内联到构造函数中,但是我得到了相同的结果(我猜测编译器会内联代码)。

我试图单独重启Visual Studio而不是让运行执行构建;没有变化。

非常感谢任何建议和帮助!

3 个答案:

答案 0 :(得分:7)

您应该只将一次随机实例化(将其设置为私有字段并在构造函数中实例化),请参阅类似的问题:Random.Next returns always the same values

请参阅Random documentation

  

随机数生成从种子值开始。如果相同   种子被重复使用,生成相同的数字系列

在您的情况下,您创建一个具有相同种子的Random实例(时间太近),并且您获取的第一个值对于给定的种子将是相同的。

答案 1 :(得分:4)

每次调用方法时,您都在重新创建随机数生成器:

public blockType generateRandomBlock()
{
    Random random = new Random();

由于随机数生成器的种子基于时间,这将为连续调用返回相同的值。

将您的生成器创建移出例程:

Random random = new Random();
public blockType generateRandomBlock()
{

答案 2 :(得分:3)

当您在非常短的时间内连续创建多个Random实例时,它们可能最终会使用相同的时间相关种子值进行初始化。

要解决此问题,您应该将Random初始化为实例字段:

private readonly Random random = new Random();

public blockType generateRandomBlock()
{
    int makeBlockOfType = random.Next(0, 100);

    // ...
}