2016-11-07 19 views
0

rand()を使用して乱数/文字を作成しようとしていますが、呼び出されるたびに同じ番号/文字が返されます。乱数生成器 - 毎回乱数を生成しない

void Location::pick() { 
    srand(time(NULL)); 
    x = rand() % fieldSize + 1; 
    int locy = rand() % fieldSize + 1; // rand y 
    switch (locy) { 
    case 1: y = 'a'; break; 
    case 2: y = 'b'; break; 
    case 3: y = 'c'; break; 
    case 4: y = 'd'; break; 
    case 5: y = 'e'; break; 
    } 
} 

は、fieldSizeは私が上にsrand関数()を使用して5に設定されています。以下は私が関数と呼ぶ場所です。

void Fleet::deployFleet() { 
    bool newLoc = true; 
    Location tmp; 

    for (int i = 0; i < fleetSize; i++) { 
     tmp.pick(); 
     ships[i].setLocation(tmp); 
    } 
} 

fleetSizeは5に設定されています。ships []は5つの船舶の配列です。 setLocation()は、船の位置を指定されたパラメータに設定するだけです。

+1

特に 'rand()%n'ではなく、' rand() 'を使わないでください。もっと読む[ここ](http://www.azillionmonkeys.com/qed/random.html)代わりに 'srand'とtimeをパラメータとして使います。 –

+0

コードが再オープンされて少し異なります。関連性が高い:http://stackoverflow.com/questions/37701567/calling-a-random-number-generating-member-function-doesnt-produce-entirely-rand – NathanOliver

+0

このコードについてのすべてが壊れている。シードとして 'time(NULL)'を使い、 'rand()'を使って '%'を使って数値の範囲を制限する複数のシード。...どこから始めるべきか分からない。 – nwp

答えて

2

擬似乱数ジェネレータは、同じシードに対して同じ「乱数」シーケンスを生成します。

繰り返しジェネレータに時間を秒単位で設定しています。あなたは非常に迅速に5回それをやっています。そのため、繰り返しは常に同じです。したがって、あなたは前記シーケンスの最初の数を取得し、常に同じになります。