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

rand% spawning all my entities in predictable pattern

本文关键字:我的 实体 模式 rand%      更新时间:2023-10-16

我一直在尝试用c++创建一个带有指纹的"1D射击游戏"。我的问题是,我试图在随机时刻从列表中产生敌人,我还想让它在敌人产生的地方(屏幕的左侧或右侧)随机产生。

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

我似乎从来没有在类似的时间看到过一对来自左边的情侣和一对来自右边的情侣。总是非此即彼。除此之外,一旦敌人产卵,其他敌人似乎几乎同时产卵,突然之间就没有产卵了。这种模式似乎是可预测的,也是错误的。

这是我的方法,它在游戏循环中每次都被调用(游戏循环负责在每次迭代中调用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);
            }
        }
    }
}

事先非常感谢。我真的希望有人能解决这个问题,因为我一直在努力寻找答案!

不要每次循环都调用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);