对于循环,运行1000次程序,在JAVA中获得蛇眼所需的平均卷数

时间:2018-04-24 08:00:44

标签: java loops for-loop

所以我之前发布了我的问题,并认为我一切都很好,但我搞砸了,并意识到我完全理解这个问题。 我不需要计算超过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.");
    }
}

但我没有得到正确的结果。我对如何实现这一点感到有些失落。请帮忙吗?

4 个答案:

答案 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 ++;
}