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

Ser*_*rov 5 c# mono xna monogame

可能重复:
随机数生成器仅生成一个随机数

不久前我对此感到有些困惑.我有以下代码:

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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Ale*_*exH 7

您应该只将Random实例化一次(将其设置为私有字段并在构造函数中实例化),请参阅类似的问题:Random.Next始终返回相同的值

请参阅随机文档:

随机数生成从种子值开始.如果重复使用相同的种子,则生成相同的数字序列

在您的情况下,您使用相同的种子(时间太近)创建一个Random实例,并获取给定种子的第一个值.


Dou*_*las 3

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

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

private readonly Random random = new Random();

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

    // ...
}
Run Code Online (Sandbox Code Playgroud)