我正在进行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);
}
}
}
}
答案 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));
但为什么?
'和'是所谓的伪随机数发生器。这意味着数字并不是真正随机的,但函数使用的算法产生的数字序列具有与随机数相似的特征,尤其是关于均匀分布的数字。
这意味着当使用相同的种子时,将产生相同的序列。这就是为什么这些发电机也被称为确定性随机数发生器。
播种它将提供不同的起始值,因此会产生不同的数字序列。