gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 17:37:50 24 4
gpt4 key购买 nike

我正在复习 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);

}

}

}

}

最佳答案

你需要意识到 <a href="http://linux.die.net/man/3/rand" rel="noreferrer noopener nofollow">rand()</a>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(<a href="http://linux.die.net/man/2/time" rel="noreferrer noopener nofollow">time</a>(NULL));

关于c - rand()在模运算后不生成随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8724582/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com