2012-01-04 87 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'是一個所謂的僞隨機數發生器。這意味着這些數字並不是真正的隨機數,但該函數使用一種算法來生成一個與隨機數具有相似特徵的數字序列,特別是關於均勻分佈的數字。

這意味着當使用相同的種子時,將會產生相同的序列。這就是爲什麼這些發生器也被稱爲確定性隨機數發生器的原因。

種子會提供不同的起始值,因此會產生不同的數字序列。