所以我遇到了模拟掷骰子游戏的问题。除了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));
}
}
答案 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;
}