5

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

前段时间我对这个有点困惑。我有以下代码:

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,而不是让运行进行构建;没有变化。

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

4

3 回答 3

7

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

请参阅随机文档

随机数生成从种子值开始。如果重复使用同一个种子,就会产生同一系列的数字

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

于 2012-12-12T14:18:19.080 回答
4

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

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

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

将生成器的创建移到例程之外:

Random random = new Random();
public blockType generateRandomBlock()
{
于 2012-12-12T14:18:44.923 回答
3

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

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

private readonly Random random = new Random();

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

    // ...
}
于 2012-12-12T14:18:14.557 回答