模数运算后rand()不生成随机数

时间:2012-01-04 09:28:35

标签: c

我正在进行C复习并参加棋盘游戏作为练习。棋盘游戏是“将军的游戏”并且非常像国际象棋,因为它使用了8x8平方的等级。

基本上,板的实现是特定结构的二维数组。因此,可以通过其索引访问板的正方形,就像x-y坐标系一样。

现在我决定随机分配各个部分,逻辑是生成一个随机的x-y坐标,检查一块是否已经存在于板上的那些坐标上,如果它可用,则用一块填充它。如果不是,则生成另一个随机x-y坐标。这种情况一直持续到所有部分都被考虑在内。

我正在使用rand()生成特定范围内的随机数(我使用模运算符和填充数来指定范围。请参阅下面的代码)

但是rand()似乎没有为我提供足够随机的数字。我一遍又一遍地用同样的作品分配! (但有趣的是,我可以在Mac上生成不同的发行版,但发行版仍然保持一致!)

请参阅下面的代码,了解我如何使用rand()生成带范围的数字。

void initPieces(){

    int player, rank_index, population, rand_min, rand_x, rand_y;

    for(player = 1; player <= 2; player++){

       if(player == 1){
            rand_min = 5;
        }else{
           rand_min = 1;
        }

        for(rank_index = 0; ir < sizeof ranking/sizeof ranking[0]; rank_index++){

            for(population = 0; population < getRank(rank_index)->population; population++){

               do{
                   rand_x = (rand() % 8) + 1;
                   rand_y = (rand() % 4) + rand_min;

               }while((getGrid(rand_x,rand_y))->has_piece == 1);

               assignPiecetoGrid(player,rank_index,rand_x,rand_y);

            }

       }

   }

}

8 个答案:

答案 0 :(得分:11)

您需要意识到rand()pseudorandom number generator,并且专门设计为返回给定种子的相同数字序列。使用srand()函数设置种子。

srand(0);
printf("the first rand() with seed 0 is %d\n", rand());
srand(1);
printf("the first rand() with seed 1 is %d\n", rand());
srand(0);
printf("the first rand() with seed 0 is still %d\n", rand());

所以,让它变得不那么可预测的方法通常是从一些随机的东西重新播种它,或者至少从每次运行程序时都不一样的东西:

srand(time(NULL));

答案 1 :(得分:5)

确保初始化/播种随机数生成器:

#include <time.h>

srand(time(NULL));

答案 2 :(得分:3)

如果你没有为伪随机数生成器播种,就像你在程序的开头调用一样:

srand(1);

您可以使用取决于时间的参数调用srand,以便连续两次调用 你的程序会产生不同的数字:

srand(time(NULL));

答案 3 :(得分:2)

是的,因为你没有“初始化”rand()。 尝试做类似srand (time(NULL)) ;

的事情

您还必须加入time.h

答案 4 :(得分:1)

您应该使用srand()为随机生成器播种。

常见的随机播种是srand ( time(NULL) );

答案 5 :(得分:0)

调用一次:

srand (time(NULL));

在致电rand()

之前初始化

答案 6 :(得分:0)

随机数生成器必须使用随机种子进行初始化。请参阅srand()功能。通常它会随着时间初始化:srand(time(NULL))

答案 7 :(得分:0)

所有答案都是正确的,您需要使用类似

之类的东西来播种rand函数
srand(time(NULL));

但为什么?

'和'是所谓的伪随机数发生器。这意味着数字并不是真正随机的,但函数使用的算法产生的数字序列具有与随机数相似的特征,尤其是关于均匀分布的数字。

这意味着当使用相同的种子时,将产生相同的序列。这就是为什么这些发电机也被称为确定性随机数发生器。

播种它将提供不同的起始值,因此会产生不同的数字序列。