簡體   English   中英

在while循環java中的無限while循環

[英]Infinite while loop inside of while loop java

所以我在模擬擲骰子游戲時遇到問題。 除了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));
    }

}

無限循環在此blook中:

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

因為如果您在初次啟動時得到的值不是7 ,那么它將始終為true,並且不會停止。

我認為您應該替換|| &&

所以它看起來像這樣:

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

此邏輯不正確。 目前,只有在sum等於7時才會退出。

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

在您的算法(newSum == sum)(newSum == 7)條件下獲勝,因此您將使用與此操作相反的操作。 邏輯否定后

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

您將擁有此解決方案。 這意味着您需要將while條件更改為(newSum != sum) && (newSum != 7)

您的程序仍然會出錯,因為您永遠不會在嵌套的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;

        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM