[英]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.