C使用嵌套函数生成随机数

时间:2016-03-30 16:52:59

标签: c

我可以使用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次。问题是它只能第一次产生随机数。其余的,它总是一样的。我需要为嵌套函数编写一个特定的方法来生成随机数吗?

2 个答案:

答案 0 :(得分:3)

现在的方式,每次拨打generateBattleShipXgenerateBattleShipY时,您都会重新播种随机数生成器。由于time以秒为单位返回时间,因此多次连续调用将返回相同的值,因此随机数生成器将以相同的值播种,从而每次都生成相同的“随机”数字。

只应在程序开始时调用

srand来为随机数生成器播种。一旦你这样做,你将获得更多的随机结果。

答案 1 :(得分:0)

dbush是正确的,但是更好的伪随机数是使用加密库(如果你的操作系统支持一个)作为&#34;随机性&#34;随机数生成器比使用时间作为种子更好。

按照目前的情况,通过更正,可以很容易地预测数字并击败游戏。&#34;