如何获得不同的随机数在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在路径中给我一个数字,所以没有敌人在草地上或挂在路上。
答
输掉srand((unsigned)time(0));
。当你的当前线程第一次启动时,只做一次。
如果你真的需要你的对象中的每一个包含它自己的随机数生成器,那么无论你的装备对象的每一个与实现这种随机数生成一个类的实例,或推出自己;你会发现这里的一些好的想法:https://*.com/a/1640399/773113
您似乎正在使用相同的种子初始化它们。在你的主要种子一次,然后不要再种子,除非你有充足的理由这样做。 – Carcigenicate
'rand()%rangeX'是一个可怕的,可怕的方式来获得均匀分布的整数,至少有两个原因。做一些研究。 – Buster
现代C++提供了丰富的随机数生成器。为什么使用'srand((unsigned)time(0));'和'rand()'。 – CroCo