私はスライムと呼ばれる敵クラスを持っていて、タイル防御ゲームのように各スライムが移動して乱数を取得しようとしています。パスの変更の方向を変更するときにスライムに伝えます)。しかし、私は3 Slimesを使用してそれを試し、それらはすべて同じ乱数で終わる。私は新しいスライムオブジェクトを作成するたびにコードが呼び出されていることを各クラスの初期化で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());
}
:私の敵のクラスは、xとyのための乱数を生成することで、このコードを持っています。私は3つの異なるスライムでテストしています。それらはすべて私に同じ乱数を与えます。再起動すると元の数とは違っていますが、3つのスライムには同じ乱数が残っています。私は何か間違っているのですか?このクラスの外側にランドを播種するべきなのですか? rangeXとrangeYはパス内に番号を与えているので、敵は草の上にいなくても、パスをぶら下げてもいけません。
あなたは、それらがすべて同じ種で初期化されているようです。一度あなたのメインにシードを入れてから、あなたに正当な理由がない限り、もう一度シードを付けないでください。 – Carcigenicate
'rand()%rangeX'は、少なくとも2つの理由から、一様に分散した整数を得るための恐ろしい、ひどい方法です。いくつかの研究を行います。 – Buster
現代C++は、豊富な乱数ジェネレータを提供します。なぜ 'srand((unsigned)time(0));'と 'rand()'を使うのですか? – CroCo