2014-02-26 222 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; 

     }