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

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

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

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

我正在使用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 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); } } } } 

您需要意识到rand()是一个伪随机数生成器 ,它专门设计为返回给定种子相同数字序列。 使用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));

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

 #include  srand(time(NULL)); 

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

 srand(1); 

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

 srand(time(NULL)); 

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

你还必须包括time.h

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

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

打电话一次:

 srand (time(NULL)); 

在调用rand()之前初始化

必须使用随机种子初始化随机数生成器。 请参阅srand()函数。 它经常用time: srand(time(NULL))初始化。

所有的答案都是正确的,你需要用类似的东西来种子rand函数

 srand(time(NULL)); 

但为什么?

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

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

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