这是我的代码,我应该是模拟掷骰子的游戏:我得到正确的胜利和失败的结果,但我不能得到正确的概率。有什么建议吗?
请帮助说明是:在掷骰子的游戏中,通过线下注的过程如下。掷两个六面骰子;掷骰子的第一次骰子被称为"出骰子"。结果为7或11自动获胜,结果为2、3或12自动失败。如果掷出的是4、5、6、8、9或10,那么这个数字就成为点。玩家继续掷骰子,直到掷到7或点数为止。如果先掷出点数,则玩家获胜。如果先掷出7,则玩家输。编写一个程序,在没有人工输入的情况下使用这些规则模拟掷骰子游戏。该程序不要求玩家下注,而是计算玩家会赢还是会输。
程序应该模拟滚动两个骰子并计算总和。添加一个循环,让程序玩10000个游戏。添加计数器来计算玩家赢了多少次,输了多少次。在1万场比赛结束时,计算获胜的概率[即获胜/(获胜+失败)]并输出该值。从长远来看,谁会赢得最多的比赛,你还是赌场?注:生成一个随机数x,其中0 x≤<1、使用x = Math.random();。例如,乘以6并转换为整数,得到的结果是介于0到5之间的整数。
public class Dice
{
public static void main(String[]args)
{
//declaring variables
int comeOutRoll1, comeOutRoll2;
int roll1, roll2;
int numW, numL;
int sum, sum2 = 0;
int thePoint = 0;
double probability;
//initializing variables
comeOutRoll1 = (int)(Math.random()*5);
comeOutRoll2 = (int)(Math.random()*5);
sum = comeOutRoll1 + comeOutRoll2;
numW = 0;
numL = 0;
for(int timesPlayed = 0; timesPlayed <= 10000; timesPlayed++)
{
switch(sum)
{
//adds how many wins and losses
case 2:
numL = numL +1;
break;
case 3:
numL = numL + 1;
break;
case 12:
numL = numL + 1;
break;
case 7:
numW = numW +1;
break;
case 11:
numW = numW +1;
break;
case 4:
thePoint = sum;
break;
case 5:
thePoint = sum;
break;
case 6:
thePoint = sum;
break;
case 8:
thePoint = sum;
break;
case 9:
thePoint = sum;
break;
case 10:
thePoint = sum;
break;
//if not any of these cases roll again
default:
roll1 = (int)(Math.random()*5);
roll2 = (int)(Math.random()*5);
sum2 = roll1 + roll2;
break;
}
if(sum2 == thePoint)
{
numW = numW +1;
}
else if(sum2 == 7)
{
numL = numL +1;
}
}
probability = (numW/(numW+numL));
System.out.println("Number of Wins: " + numW);
System.out.println("Number of Losses: " + numL);
System.out.println("The probability of winning is: " + probability + " percent");
}
}
2个问题…
- 你只分析1个(随机)结果。你需要在整个游戏中循环10000次,而不仅仅是第二次滚动,这应该只循环到你得到结果为止。
- 你正在做整数除法(截断以留下一个整数)。使用浮点数学,将其中一个数字转换为
float
或double
。Ieprobability = (float)numW/(numW+numL);
// returns the random integer between 1 and 6 inclusive
method rollDie()
// returns the sum of a random roll of 2 dice
method rollDice()
return rollDie() + rollDie()
// return true if the player won given the point
method won(point)
roll = rollDice()
if roll == 7 return false
if roll == point return true
return won(point)
// main
define wins variable (you don't need a losses variable. losses = 10000 - wins
loop 10000 times {
comeOut = rollDice()
if comeOut in (7, 11) or (comeOut not in (2, 3 or 12) and won(comeOut))
wins++
}
probability = (float)wins/10000
把上面的代码转换成java,你应该可以很好地使用了(和你将有望学到一些东西-参见DRY)。
编辑后的工作方案
public static void main(String[]args)
{
//declaring variables
int roll1, roll2;
int numW = 0;
int numL = 0;
int sum = 0;
int thePoint = 0;
double probability;
// Loop will run 1001 time due to <=
for(int timesPlayed = 0; timesPlayed <= 1000; timesPlayed++)
{
roll1 = (int)(Math.random()*5)+1;
roll2 = (int)(Math.random()*5)+1;
sum = roll1 + roll2;
switch(sum)
{
//adds how many wins and losses
case 2:
case 3:
numL = numL + 1;
break;
case 12:
numL = numL + 1;
break;
case 7:
case 11:
numW = numW +1;
break;
case 4:
case 5:
case 6:
case 8:
case 9:
case 10:
thePoint = sum;
break;
default:
// You should never logically reach here, so could remove.
}
if(thePoint!=0){
do{
roll1 = (int)(Math.random()*5)+1;
roll2 = (int)(Math.random()*5)+1;
sum = roll1 + roll2;
}while(sum!=thePoint & sum!=7);
if(sum == thePoint)
{
numW = numW +1;
}else{
numL = numL +1;
}
}
thePoint = 0;
}
probability = (double)numW/(numW+numL); // (numW + numL) could just be total number of games if made into a variable and used as for loop condition aswell.
System.out.println("Number of Wins: " + numW);
System.out.println("Number of Losses: " + numL);
System.out.println("The probability of winning is: " + probability + " percent");
}
You had to:
- 在循环时包含重新滚动,否则它将使用相同的重复值。
- 如果是4、5、6、8、9或10的情况,那么你必须继续滚动,直到新的滚动等于7或
thePoint
。- 在计算概率时,您正在进行整数除法,这可能导致0的四舍五入。
按规范工作。整理变量