rand%以可预测的模式生成我的所有实体

时间:2015-12-26 13:52:24

标签: c++ c++11 visual-c++ random while-loop

我一直在努力创造一个" 1D射击游戏"用c ++打印。我的问题是我试图在随机时刻从列表中产生敌人,我也想让它随机出现在敌人产生的地方(屏幕左侧或右侧)。

这似乎没有完全奏效,因为我似乎从一侧得到了一群连续的敌人,只有在从左侧来的所有敌人被杀之后,右翼的敌人才会出现。

我似乎从来没有从左边得到一对夫妇,而在相似的时间,有一对夫妇来自右边。它总是一个或另一个。 除此之外,一旦敌人产生,其余的似乎几乎全部产生,突然间没有任何产卵。这种模式似乎是可预测和错误的。

这是我的方法,每次在游戏循环中调用(游戏循环负责在每次迭代时调用srand(time(NULL)),然后调用此函数。

void Enemy::spawnEnemy()
{
    if (enemList.size() < 5)
    {
        if (!(rand() % 3))
        {
            if (!(rand() % 2))
            {
                Enemy * newEnemy = new Enemy(worldWidth, 'l');
                enemList.push_front(newEnemy);
            }
            else
            {
                Enemy * newEnemy = new Enemy(0, 'r');
                enemList.push_front(newEnemy);
            }
        }
    }
}

非常感谢您提前。我真的希望有人可以解决这个问题,因为我一直在努力寻找答案!

1 个答案:

答案 0 :(得分:4)

不要在每个循环中调用srand。您应该只播种一次,然后拨打rand()以获取随机数。

由于您标记了C ++ 11,因此您应该使用新的<random>标头生成随机数字:

#include <random>

std::random_device rd;
std::mt19937 gen(rd()); // seed the random_device, only do this _once_

...
//generating a random integer:
std::uniform_real_distribution<> distribution(1, 3); // create a distribution to pick from ( 1 - 3)
int random = distribution(gen);