2012-01-04 83 views
2

我正在进行C复习并将棋盘游戏作为练习。棋盘游戏是“将军之战”,与国际象棋非常相似,因为它使用8x8平方的棋子。rand()在模操作后不会生成随机数

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

现在我决定随机散布这些棋子,逻辑就是生成一个随机的xy坐标,检查一块棋子是否已经驻留在棋盘上的这些坐标上,并且如果棋子可用。如果不是,则生成另一个随机x-y坐标。这一直持续下去,直到所有部分都被解决。

我使用兰特(),以产生在特定范围内的随机数(我使用模运算符和一个填补数支配的范围内。参见下面的代码)

但是兰特()没有按” t似乎给了我足够多的随机数字。我一遍又一遍地重复同样的作品发行! (但有趣的是,我可以在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); 

      } 

     } 

    } 

} 
+4

你在用srand()'在某处播种发电机吗? – 2012-01-04 09:30:51

+0

我爱它当有人删除我的意见。这是管理员的事吗? – 2012-01-04 09:33:33

+0

这是*实际的*可编译的代码吗?它看起来并不像我这样编译,例如对于(人口= 0;人口人口;人口++)'? – 2012-01-04 09:38:36

回答

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));

+0

时间去了哪里在你的代码示例;)? – codeling 2012-01-04 09:34:19

+0

+1为完整答案。只要提醒一下类似srand(time(NULL))的调用;是必要的。 – cateof 2012-01-04 09:35:11

+0

@nyarlathotep:好点,我想我迷惑了自己。 :)编辑,谢谢你们。 – unwind 2012-01-04 09:37:35

1

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

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

2

是的,因为你dind't “初始化” 的RAND()。 尝试做这样的事情srand (time(NULL)) ;

你必须还包括time.h

0

呼叫这一次,

srand (time(NULL)); 

初始化调用rand()

5

确保初始化/种子随机前号码发生器:

#include <time.h> 

srand(time(NULL)); 
0

随机数发生器必须用随机种子进行初始化。请参阅srand()函数。通常它随时间初始化:srand(time(NULL))

3

如果没有种子的伪随机数生成器,它是一样,如果你在程序开始叫:

srand(1); 

可以调用srand与依赖于时间,这样的参数两次连续调用程序的 会产生不同的数字:

srand(time(NULL)); 
0

所有的答案是正确的,你需要的东西种子rand函数就像

srand(time(NULL)); 

但是为什么?

'rand'是一个所谓的伪随机数发生器。这意味着这些数字并不是真正的随机数,但该函数使用一种算法来生成一个与随机数具有相似特征的数字序列,特别是关于均匀分布的数字。

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

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