2016-03-30 16 views
-3

乱数をsrand、rand(播種によって)で生成することができます。私はちょうど1つの特定の関数で実行する必要がある場合、それは大丈夫です。しかし、私はこのようなコードを持っています。Cネストされた関数で乱数を生成する

int generateBattleShipX() { 
     srand (time(NULL)); 
    return rand() % 14; 
} 

int generateBattleShipY() { 
    srand (time(NULL)); 
    return rand() % 14; 
} 

int tryToFillBattleField(int X, int Y) { 

if ((X >= 1 && X <= 13) && (Y >= 1 && Y <= 13)) //battle ship is in the field 
{ 

    int lowerX = X - 1; 
    int upperX = X + 1; 

    int lowerY = Y - 1; 
    int upperY = Y + 1; 

    // printf("lowerX = %d upperX = %d lowerY = %d upperY = %d", lowerX, upperX, lowerY, upperY); 
    int left = my_data[Y][lowerX]; 
    int top = my_data[lowerY][X]; 
    int right = my_data[Y][upperX]; 
    int bottom = my_data[upperY][X]; 

    if (left == 0 && top == 0 && right == 0 && bottom == 0) { 
     my_data[Y][lowerX] = track; 
     my_data[lowerY][X] = track; 
     my_data[Y][upperX] = track; 
     my_data[upperY][X] = track; 
     my_data[Y][X] = track; 
     track++; 

     if (track > 10) { 
      return 1; //stop 
     } 
     else { 
       int x = generateBattleShipX(); 
       int y = generateBattleShipY(); 

      // printf("x = %d y = %d \n",x,y); 
     tryToFillBattleField(x, y); //filling next battle ship 
     } 
    } 
    else { 
       int x = generateBattleShipX(); 
       int y = generateBattleShipY(); 

     tryToFillBattleField(x, y);//redoing because it overlap 
    } 
    return 0; 
} 
else { 
    // redoing because battle ship is out of field.. 
       int x = generateBattleShipX(); 
       int y = generateBattleShipY(); 
      // printf("x = %d y = %d \n",x,y); 

     tryToFillBattleField(x, y); 
    return 0; 
} 
    return 0; 
} 

tryToFillBattleFieldは、そのメソッドによって何度も何度も呼び出されます。問題は、最初の時間だけ乱数を生成できることです。残りの部分については、常に同じです。乱数を生成するネストされた関数のために書く必要がある特定のメソッドはありますか?

+1

RTFM: 'srand()' *を一度*呼び、プログラム内で一度だけ呼び出します。 –

+0

「ランダムな世代の悪い日」ですか? – Olaf

答えて

3

今のように、generateBattleShipXまたはgenerateBattleShipYを呼び出すたびに、乱数ジェネレータを再シードします。 timeは時間を秒単位で返すので、複数の連続した呼び出しは同じ値を返すので、乱数ジェネレータは同じ値でシードされ、毎回同じ「乱数」が返されます。

srandは、乱数ジェネレータをシードするプログラムの開始時に一度だけ呼び出される必要があります。一度これを行うと、よりランダムな結果が得られます。

+0

ありがとうございます。私は今得た。私は10分であなたの答えを受け入れます(stackoverflowは私がすぐに受け入れることができません) –

0

dbushは正しいですが、乱数ジェネレータの「ランダム性」が時間をあなたのシードとして使用するよりも優れているため、より良い擬似乱数は暗号化ライブラリ(OSがサポートしている場合)を使用することです。

修正を加えれば、数字を予測して「ゲーム」を無効にすることは簡単です。