无限循环内部while循环java

时间:2014-02-26 09:35:13

标签: java while-loop nested-loops

所以我遇到了模拟掷骰子游戏的问题。除了while循环中的while循环外,一切都正常运行。在调试时,sum变量保留了它的值,newSum变量在每次迭代中都在变化,并且经常达到7和sum变量的值。如果我注释掉嵌套的while循环,并将其作为wins++;,那么代码将正确执行,达到预期值。所以我很确定这个问题是在嵌套循环中。

感谢您的所有投入!!

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));
    }

}

4 个答案:

答案 0 :(得分:0)

无限循环就在这个流氓中:

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;
}

答案 1 :(得分:0)

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

这个逻辑不正确。目前,如果总和等于7,它将只会退出。

你需要使用&amp;&amp;不是||。

答案 2 :(得分:0)

在您的算法(newSum == sum)(newSum == 7)条件获胜时,您将使用与此操作相反的方法。在逻辑否定之后

  

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

你将有这个解决方案。这意味着您需要将while条件更改为(newSum != sum) && (newSum != 7)

答案 3 :(得分: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;

        }