2011-02-04 86 views
2

這是一個非常棒的意外功能,它使得「洗牌」一系列「卡片」變得糟糕。我得到相同數字的事實告訴我,每次挑選單獨的種子都會遇到一些問題。我是否使用srand48time(NULL)通話不正確?我是否缺少一些潛在的邏輯缺陷? time()的值是不是沒有足夠的時間間隔?爲什麼我的C隨機數發生器只返回「42」?

代碼正在Linux上運行。

void shuffle() 

{ 
    int i_rnd; /* Integer random number, range 0..100 */ 
    int i_rnd2; 
    card tempCard; /*temporary card to facillitate swapping*/ 
    int i = 0; /*can't use a FOR loop 'cause we're not using c99 standard*/ 
    while(i < 1000) 
    { 

     srand48((unsigned) time(NULL)); /* Seed the random number generator */ 
     i_rnd = (int) (drand48() * 100); 
     i_rnd = i_rnd%52; // return a random number 0-51  
     i_rnd2 = (int) (drand48() * 100); 
     i_rnd2 = i_rnd2%52; // return a random number 0-51 
     /*we have two random numbers, now exchange the two objects with the 
    /picked array indices */ 
     tempCard = cardDeck[i_rnd]; 
     cardDeck[i_rnd]=cardDeck[i_rnd2]; 
     cardDeck[i_rnd2]=tempCard; 
     //swap complete. increment counter so we can eventually get out of the while 
     i++; 

    } 

return; 

} 
+20

42是生命,宇宙和一切的答案。 – 2011-02-04 01:36:35

+2

該程序給你** **答案,而不必經過這些步驟。我希望我有一臺像你這樣的電腦。 – Mehrdad 2011-02-04 01:39:23

回答

14

您需要播種僞隨機數發生器一次,不是每一個使用它的時間。

許多(大多數?)僞隨機數發生器(PRNG)在給定某個種子值的情況下是確定性的。如果time()每次執行循環時都返回相同的值,那麼您在每次使用PRNG之前都要使用相同的值,因此當您查詢隨機數時,它會返回相同的值。

5

因爲您每次通過具有相同種子的循環播放您的隨機數生成器(它在不到一秒鐘內運行)。在程序開始時撥打srand48()

0

PRNG總是確定性的...... PRNG的隨機性不是通過它的邏輯而是通過它使用的種子獲得的。

因此,爲了實現隨機性,使種子儘可能隨機。