2014-02-26 218 views
0

所以我有一個模擬骰子游戲的問題。除了while循環內的while循環外,一切都正常運行。在調試時,sum變量正在保留其值,newSum變量在每次迭代中都會發生變化,並且經常會觸及7和sum變量的值。如果我將嵌套的while循環註釋掉,並將其作爲wins++;,則代碼將正確執行,以達到期望值。所以我很確定這個問題在嵌套循環中。while循環中的無限while循環java

感謝您的所有輸入!

import java.util.Random; 
import java.text.DecimalFormat; 

public class Ch3Ex2 
{ 
     public static void main (String[] args) 
    { 
     Random rng = new Random(); 
     int counter = 0; 
     int sum = 0; 
     int wins = 0; 
     int losses = 0; 
     int newSum = 0; 
     int reroll1 = 0; 
     int reroll2 = 0; 
     while (counter < 10000) 
     { 
       int die1 = rng.nextInt(6) + 1; 
       int die2 = rng.nextInt(6) + 1; 
      sum = die1 + die2; 

      if ((sum == 7) || (sum == 11)) 
       wins++; 

      else if ((sum == 2) || (sum == 3) || (sum == 12)) 
       losses++; 

      else 
      { 
       while((newSum != sum) || (newSum != 7)) 
       {     
        reroll1 = rng.nextInt(6) + 1; 
        reroll2 = rng.nextInt(6) + 1; 
        newSum = reroll1 + reroll2; 
       } 
       if (newSum == sum) 
       { 
        wins++; 
       } 
       else 
       { 
         losses++; 
       } 

      } 
      counter++; 
     } 
     DecimalFormat percent = new DecimalFormat("0.00%"); 
     double winDenom = wins + losses; 
     double winRate = wins/winDenom; 
     System.out.print("Your chance of winning a game of craps is : "); 
     System.out.println(percent.format(winRate)); 
    } 

} 
+2

除非'sum'等於'7',否則至少有一個條件總是「真」。 –

+1

調試你的代碼。 – Maroun

+1

蹩腳的代碼格式化和不連貫的括號風格的問題是,那個人會遇到許多錯誤,否則就不會想到。 – Smutje

回答

0

的無限循環在這個blook:

while((newSum != sum) || (newSum != 7)) 
{     
    reroll1 = rng.nextInt(6) + 1; 
    reroll2 = rng.nextInt(6) + 1; 
    newSum = reroll1 + reroll2; 
} 

,因爲如果你有在第一次啓動一個不7值,它永遠是真實的,而不是停止。

我想你應該&&

更換||所以它看起來是這樣的:

while((newSum != sum) && (newSum != 7)) 
{     
    reroll1 = rng.nextInt(6) + 1; 
    reroll2 = rng.nextInt(6) + 1; 
    newSum = reroll1 + reroll2; 
} 
+0

就是這樣,謝謝! – Actarius

0
  while((newSum != sum) || (newSum != 7)) 

這種邏輯是不正確。目前只有在總和等於7時纔會退出。

您需要使用& &不是||。

0

在您的算法(newSum == sum)(newSum == 7)條件贏,所以你會使用這個動作的相反。邏輯非

¬(x或y)=¬x和¬y

後,你將有此解決方案。這意味着你需要改變你的條件爲(newSum != sum) && (newSum != 7)

0

您的程序仍然是錯誤的,因爲您從不更新嵌套while循環中的newSum。

一旦你進入嵌套while循環,你的newSum設置爲7.然後它不會再改變。那麼這會讓你的勝利機率達到20%左右。

因此,您需要在嵌套while循環終止後將newSum更新爲0。然後贏的變化將是大約50%。您應該

 else 
     { 
      while((newSum != sum) || (newSum != 7)) 
      {     
       reroll1 = rng.nextInt(6) + 1; 
       reroll2 = rng.nextInt(6) + 1; 
       newSum = reroll1 + reroll2; 
      } 
      if (newSum == sum) 
      { 
       wins++; 
      } 
      else 
      { 
        losses++; 
      } 
      newSum = 0; 

     }