乱数を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は、そのメソッドによって何度も何度も呼び出されます。問題は、最初の時間だけ乱数を生成できることです。残りの部分については、常に同じです。乱数を生成するネストされた関数のために書く必要がある特定のメソッドはありますか?
RTFM: 'srand()' *を一度*呼び、プログラム内で一度だけ呼び出します。 –
「ランダムな世代の悪い日」ですか? – Olaf