2013-11-15 20 views
-2

我試圖在C編程中爲用戶引發2個骰子的「遊戲」,爲PC引發2個骰子,誰獲得更大的數額贏得, 當我在visual studio中調試我在變量值和控制檯窗口中看到很好的結果,但是當我運行它時沒有調試用戶和PC都始終獲得相同的值爲他們骰子(例如用戶獲得2和2,PC獲得2和2)。真的很奇怪,程序的調試工作正常,但是當我運行它時,我得到了一個奇怪的結果

任何人都可以解決它嗎?我在過去的3個小時裏看着它,我無法找到問題所在。

你叫 throwDice
  #define _CRT_SECURE_NO_WARNINGS 
      #include <stdlib.h> 
      #include <stdio.h> 
      #include <time.h> 
      int throwDice(); 
      int diceSum(); 
      int main() 
      { 
       int res1; 
       res1=diceSum(); 
       if(res1==0) 
        printf("It is a tie!\n"); 
       if(res1==1) 
        printf("You Won!\n"); 
       if(res1==-1) 
        printf("You Lost\n"); 
      } 
      int throwDice() 
      { 
      int i; 
      srand((unsigned)time(NULL)); 
      i = (rand()%(6-1)) + 1; 
      return i; 
      } 
      int diceSum() 
      { 
       int j,a=0,b,c=0,d=0; 
       int array[4]; 
       for(j=1;j<=2;j++) 
       { 
        array[c]=throwDice(); 
        a=a+array[c]; 
        c++; 
       } 
        for(b=1;b<=2;b++) 
       { 
        array[c]=throwDice(); 
        d=d+array[c]; 
        c++; 
       } 
       printf("You got %d and %d.\nYour opponent got %d and %d.\n",array[0],array[1],array[2],array[3]); 
       if(a==d) 
        return 0; 
       if(a>d) 
        return 1; 
       else 
        return -1; 
      } 
+2

你只應該給隨機數發生器播種一次,而不是每次扔骰子。將調用從'throwDice'移出''srand'到'main'。 – SomeWittyUsername

回答

4

每次,您重新初始化與當前時間的隨機數發生器。

時間的準確性只有1秒,所以在該程序的單次運行中,時間不會改變,因此您會得到相同的結果。

您是應該調用srand只有一次,你的程序的開始附近。

documentation

「使用相同的種子將產生後續調用蘭特結果同樣繼承了兩種不同的初始化。」

1

隨機數發生器不會從任何地方抽出隨機數。當你種下它時,你首先給它一個好數字,然後從那裏產生一堆隨機數。

問題是,它會給你一個隨機數序列,但是如果連續兩次給它同一個種子,那麼這個序列將是相同的。這就是爲什麼重要的是你的種子價值是相對隨機的。嘿,時間非常隨意,兩個人最終會在同一時間運行該程序的機會有多大?

你在做什麼,在每次致電rand之前播種發生器,而不是在開始播種,並讓隨機數發生器完成其工作。由於time僅以秒爲單位返回時間(請參閱man page),因此每次循環運行時都會得到相同的數字,直到下一秒開始。

相關問題