所以我之前发布了我的问题,并认为我一切都很好,但我搞砸了,并意识到我完全理解这个问题。 我不需要计算超过1000个骰子卷的蛇眼的平均值,而是需要计算超过1000个骰子的蛇眼的平均数量。 我对如何实现这一点感到有些迷茫。 我试过这个:
public class RollDiceforloop {
public static void main(String[] args) {
int die1, die2, snakeye, rolls, game;
snakeye = 0;
die1 = 0;
die2 = 0;
rolls = 0;
for (game = 0; game < 1000; game++) {
die1 = (int)(Math.random()*6)+1;
die2 = (int)(Math.random()*6)+1;
if (die1 != 1 && die2 != 1); {
rolls +=1;
}
if (die1 == 1 && die2 == 1) {
snakeye +=1;
rolls +=1;
}
}
float average = snakeye / (float) rolls;
TextIO.putln(""+snakeye+" Snake Eyes over "+game+" games, with an average of "+average+" rolls required to get a Snake Eye.");
}
}
但我没有得到正确的结果。我对如何实现这一点感到有些失落。请帮忙吗?
答案 0 :(得分:2)
一种简单计算你获得Snakeeyes的投掷次数的方法如下:
int count = 0;
for (int i = 0; i < 1000; ++i)
{
int result = 0;
while (result != 2)
{
result = (int) (Math.random() * 6) + (int) (Math.random() * 6) + 2;
++count;
}
}
System.out.println(count / 1000.d);
跑步应该让你得到一个大约36的结果,这基本上是预期值,因为你每次投掷有可能获得1/36来获得一个Snakeeyes,所以理论上从长远来看你会得到一个36抛出。
然而,这有点歪曲数学。这是否告诉你在没有Snakeeyes的37次投掷之后你的骰子是不平衡的?或者,如果你在2卷之后得到一个Snakeeyes你就会以某种方式作弊? 不,显然不是。
这就是数学进入等式的地方。让我先说一下,没有办法计算它带你去看Snakeeyes的确切投掷次数。我们能做的是根据置信度计算概率。 这里的信心基本上是这样说:
我希望x%有机会获得蛇眼。
x
是自信。有信心,你可以使用简单的公式
1 - (35 / 36) ^ n > x
并为n
解决这个问题,以获得一定数量的投掷,并且给定一个或多个蛇眼。请注意,35/36
是获得蛇眼的机会,而不是其他任何东西。
所以,让我们说我们真的很想要那些蛇眼。我们的信心为99.9%。
通过公式,我们可以获得n = 246
。所以我们需要246次投掷才能获得至少一个蛇眼的99.9%的几率。
我们赌博的方式多一点。我们说只要有50%的机会获得蛇眼,我们就可以了。因此,我们得到n = 25
。
实际上低于我们的计算值。
那我该怎么说呢?显然,你可以用足够多的尝试进行实验,最后你总能得到抛出的预期值(这实际上称为&#34;大数定律&#34;)。然而,这对于确定实际获得蛇眼的数量有多少没有价值。它只是计算预期值。这是一个真正需要实验的东西。
所以方法
return 36;
在这里实际上已经足够好了。
答案 1 :(得分:1)
你的逻辑有点不对劲。你需要做N次测试(游戏),每次测试都要等到蛇眼出现并计算必要的卷数。你可以说你需要等待而没有出现蛇眼。要计算平均值,您需要存储每个测试的结果。
示例:强>
public static void main( String[] args )
{
int dice1;
int dice2;
// The amount of tests
final int SIZE = 10000000;
// store all results we got from a single test
int[] result = new int[SIZE];
// loop through the tests
for(int i = 0; i < SIZE;i++)
{
// initialize counter for every test
int rolls = 0;
do
{
// roll counter increases
rolls++;
dice1 = (int)(Math.random()*6)+1;
dice2 = (int)(Math.random()*6)+1;
// check if condition is met.
}while(dice1 != 1 || dice2 != 1);
// store the result of the test
result[i] = rolls;
}
// calculate the average amount of rolls necessary
double avg = Arrays.stream( result ).sum() / (double)SIZE;
System.out.println( avg );
}
答案 2 :(得分:1)
现在我需要的卷片甚至无法计算。
public class RollDiceforloop3 {
public static void main(String[] args) {
int die1, die2, game, rolls;
rolls = 0;
for (game = 0; game < 1000; game++)
{
die1 = 0;
die2 = 0;
while (die1 != 1 || die2 != 1)
{
die1 = (int)(Math.random()*6)+1;
die2 = (int)(Math.random()*6)+1;
rolls +=1;
}
}
double average = rolls / (double) game;
TextIO.putln("The average number of rools required to get Snake Eyes is "+average+", after running the program 1000 times.");
}
}
答案 3 :(得分:0)
如果理解了你的代码,我想你可能想要在实现蛇眼时开始计数,否则增加滚动次数。另外,当只有一个卷等于1时,您可能想要增加计数器。这两件事可能会污染你的结果。
if (die1 == 1 && die2 == 1) {
snakeye ++;
rolls = 0;
} else {
rolls ++;
}