2017-07-18 7 views
0

私はスライムと呼ばれる敵クラスを持っていて、タイル防御ゲームのように各スライムが移動して乱数を取得しようとしています。パスの変更の方向を変更するときにスライムに伝えます)。しかし、私は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はパス内に番号を与えているので、敵は草の上にいなくても、パスをぶら下げてもいけません。

+2

あなたは、それらがすべて同じ種で初期化されているようです。一度あなたのメインにシードを入れてから、あなたに正当な理由がない限り、もう一度シードを付けないでください。 – Carcigenicate

+1

'rand()%rangeX'は、少なくとも2つの理由から、一様に分散した整数を得るための恐ろしい、ひどい方法です。いくつかの研究を行います。 – Buster

+1

現代C++は、豊富な乱数ジェネレータを提供します。なぜ 'srand((unsigned)time(0));'と 'rand()'を使うのですか? – CroCo

答えて

-1

srand((unsigned)time(0));が失われます。現在のスレッドが最初に起動したときに一度だけ行います。

それぞれのオブジェクトに独自の乱数ジェネレータが必要な場合は、オブジェクトの各オブジェクトにそのような乱数ジェネレータを実装するクラスのインスタンスを装備するか、独自のロールを作成します。 https://stackoverflow.com/a/1640399/773113

+1

プログラムの起動時に1回だけ。 –

+1

良いことは、 'srand'と' rand() 'を完全に放棄することです。 – CroCo

+0

@CroCoはい、そういうわけで、あなた自身の乱数ジェネレータを使ったQ&Aへのポインタを追加しました。 –

1

新しいSlimeオブジェクトを作成するたびに、同じ値にrand()を再配分します。これは、rand()が各スライムに対して同じ数を生成することを意味します。

プログラムの先頭(メイン)にrand()を1回だけ投入すると、異なる値が得られます。

+1

あなたは本当に 'rand()'を放棄するべきです。乱数は生成されません。 – CroCo

+0

@CroCo - 他の擬似乱数ジェネレータも実行しません。しかし、 'rand()'はこれを含む多くの目的に適しています。 –

+1

@PeteBeckerにもかかわらず、 'rand()'は実際には本当に悪いですし、幸いにもいくつかの_standard_代替乱数ジェネレータがあります。 'rand()'が適切だと言うのは恐ろしい考えです。 – CroCo

関連する問題