连续3次获得的机会

时间:2015-01-25 17:52:37

标签: java probability

我正在尝试模拟“三面骰子”以及连续3次获得相同数字的机会。我相信这个公式是这样的:(1/3)^ 3 我在java中做了以下几次尝试来模拟这个:

        win = (int) (Math.random() * 3);

        if (win != 1) {
            n=0;
        }
        if (win == 1) {
            n++;
        }
        if (n == 3) {
            n=0;
            l++;
        }

        y++;

所以l将是连续三次出现相同结果的次数。 y将是'roll'的总数。然而,我得到的结果并不倾向于(1/3)^ 3多次尝试。这是因为我只计算1连续出现而不是1 OR 2 OR 3连续出现3次?或者这里的错误是什么。感谢

2 个答案:

答案 0 :(得分:1)

代码很清楚它在做什么。我建议像这样重组它

Random rand = new Random();
int attempts = 10000;
int allSame = 0;
for (int i = 0; i < attempts; i++) {
    int a = rand.nextInt(3);
    int b = rand.nextInt(3);
    int c = rand.nextInt(3);
    if (a == b && b == c)
        allSame++;
}
System.out.println("The ratio was " + (double) allSame / attempts);

使用Java 8

IntSupplier dice = () -> rand.nextInt(3);
int allSame = IntStream.range(0, attempts)
                        .map(i -> dice.get())
                        .filter(d -> d == dice.get() && d == dice.get())
                        .count();

答案 1 :(得分:0)

我不确定您在代码中尝试了什么,但您的声明应该是(1/3)^3不正确。

必须是(1/3)^2,正如Peter Lawrey在评论中所说:

  1. 第一个骰子可以是任何数字0-2。
  2. 第二个骰子必须是相同的数字,具有1/3的可能性。
  3. 第三个骰子也有可能性1/3
  4. 这会产生公式1/3 * 1/3 = 1/9
  5. 如果您这样想,您会得到相同的结果:

    1. 如果你掷骰子三次,你会得到27种不同的可能性 (3^3)。
    2. 其中三种可能性有所需(0-0-01-1-12-2-2)。
    3. 因此,您的可行性为3/27 = 1/9
    4. 您的代码确实令人困惑,因此我建议将其编写为不同的内容:

      int lastNumber[2];
      int winCount = 0;   
      
      for(n = 0; n< 1000; ++n){
      
          int num = (int) (Math.random() * 3);
          if(num == lastNumber[0] && lastNumber[0] == lastNumber[1] && n > 2){
              ++winCount;
          } 
          lastNumber[0] = lastNumber[1];
          lastNumber[1] = num;
      }
      system.println("Propability = " + (winCount*100)/1000.0f);
      

      但请注意,如果你的骰子连续4次相同,则winCount会增加两倍。 (如果您不想要这种行为,请使用num=4;