如何获得不同的随机数在C++中每个类的初始化

问题描述:

我有一个名为泥的敌对阶级和各煤泥向下行进路径(如塔防游戏),我试图让一个随机数(这将告诉粘液何时改变路径改变的方向)。但是我使用3 Slime来试用它们,它们都以相同的随机数字结束。我的敌人类有这个代码在它为x和y生成随机数字:如何获得不同的随机数在C++中每个类的初始化

Enemy::Enemy(Level* level, float x, float y, float speed, int direction, int width, int height) 
    : 
    Entity(level, x, y, width, height), // Each enemy is an entity 
    speed(speed), 
    direction(direction) 
{ 
    srand((unsigned)time(0)); 

    rangeX = (level->GetTileWidth() * level->GetScale() - width * level->GetScale()) - (width * level->GetScale()) + 1; 
    rangeY = (level->GetTileHeight() * level->GetScale() - height * level->GetScale()) - (height * level->GetScale()) + 1; 

    randNumX = (rand() % rangeX) + (width * level->GetScale()); 
    randNumY = (rand() % rangeY) + (height * leel->GetScale()); 
} 

当我创建一个新的Slime对象时,就会调用这段代码。我用三种不同的粘液测试,他们都给我相同的随机数。当我重新启动时,它们与原始数字不同,但所有三种粘液仍然具有相同的随机数。难道我做错了什么?我应该在这个班级以外的地方播种兰特,因此它只被调用一次?范围X和范围Y在路径中给我一个数字,所以没有敌人在草地上或挂在路上。

+2

您似乎正在使用相同的种子初始化它们。在你的主要种子一次,然后不要再种子,除非你有充足的理由这样做。 – Carcigenicate

+1

'rand()%rangeX'是一个可怕的,可怕的方式来获得均匀分布的整数,至少有两个原因。做一些研究。 – Buster

+1

现代C++提供了丰富的随机数生成器。为什么使用'srand((unsigned)time(0));'和'rand()'。 – CroCo

输掉srand((unsigned)time(0));。当你的当前线程第一次启动时,只做一次。

如果你真的需要你的对象中的每一个包含它自己的随机数生成器,那么无论你的装备对象的每一个与实现这种随机数生成一个类的实例,或推出自己;你会发现这里的一些好的想法:https://*.com/a/1640399/773113

+1

或者只有一次,当程序启动时。 –

+1

一件好事是放弃'srand'和'rand()'。 – CroCo

+0

@CroCo是的,这就是为什么我用自己的随机数生成器添加指向问与答的指针。 –

您是重新播种兰特()相同的值每次创建新的对象煤泥时间。这意味着rand()为每个Slime生成相同的数字。

如果你是唯一的种子兰特()一次在节目的开头(主),你会得到不同的值。

+1

你应该放弃'rand()'。它不会生成随机数字。 – CroCo

+0

@CroCo - 既没有其他的伪随机数发生器。但是'rand()'对于很多目的是足够的,包括这个。 –

+1

@PeteBecker,但是,'rand()'真的很糟糕,幸运的是有一些_standard_替代随机数生成器。说'rand()'就足够了,这是一个可怕的想法。 – CroCo