代码只能通过它与调试器步进时能够正常运行? [重复](Code runs correctly o

2019-08-03 23:47发布

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

我有点这个几分钟前百思不得其解。 我有以下代码:

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它采用了单声道编译器,而不是微软的一个。 难道这是问题? 我试图内嵌把这段代码到构造函数从它被称为在那里,但我得到了同样的结果(我猜编译器内联代码反正)。

我试图重新启动Visual Studio它分开,而不是让运行做的构建; 没有变化。

任何建议和帮助是极大的赞赏!

Answer 1:

你应该实例化随机只有一次(将其设置为在构造私有字段和实例化),看到类似的问题: Random.Next总是返回相同的值

请参阅随机文档 :

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

在你的情况,您创建使用相同的种子(时间太近)随机实例,你拿这将是一个给定的种子相同的第一个值。



Answer 2:

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

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

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

将你的日常外面发电机的创作:

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


Answer 3:

当您创建的多个实例Random先后在一段很短的时间,他们很可能会结束了,同时相关的种子值越来越初始化。

要解决这个问题,你应该初始化Random为实例字段,而不是:

private readonly Random random = new Random();

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

    // ...
}


文章来源: Code runs correctly only when stepping through it with debugger? [duplicate]