我可以使用srand,rand(通过播种)生成随机数。如果我只需要运行1个特定的功能,那就没关系。但是,我有这样的代码。
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被其方法一次又一次地调用大约10次。问题是它只能第一次产生随机数。其余的,它总是一样的。我需要为嵌套函数编写一个特定的方法来生成随机数吗?
答案 0 :(得分:3)
现在的方式,每次拨打generateBattleShipX
或generateBattleShipY
时,您都会重新播种随机数生成器。由于time
以秒为单位返回时间,因此多次连续调用将返回相同的值,因此随机数生成器将以相同的值播种,从而每次都生成相同的“随机”数字。
srand
来为随机数生成器播种。一旦你这样做,你将获得更多的随机结果。
答案 1 :(得分:0)
dbush是正确的,但是更好的伪随机数是使用加密库(如果你的操作系统支持一个)作为&#34;随机性&#34;随机数生成器比使用时间作为种子更好。
按照目前的情况,通过更正,可以很容易地预测数字并击败游戏。&#34;