在给定范围内生成具有不同概率的随机数

时间:2021-01-08 20:40:59

标签: java algorithm loops probability

是否有一种简单的算法可以打印掷骰子的结果,使得获得 1、2、3、4、5 的概率为 1/9,获得 6 的概率为 3/9。

我想在 Java 中实现这一点,并且有意只使用 Math.random()、if 语句、for/while 循环。

3 个答案:

答案 0 :(得分:1)

正如其他人建议使所有事件的总和等于 1,那么数字 9 将有 4/9 的概率被选中。

生成一个 1 到 9 之间的随机数,包括两端。如果数字是 1 到 5,则您掷出该数字,否则,您掷出 6。请注意,此方案中有 4 次机会掷出 6,总共有 5 次机会掷出 1 到 5。

Random random = new Random();
int roll = random.nextInt(9) + 1; // create a random number

if (roll > 5) {
    System.out.println("You rolled a 6");
}
else {
    System.out.println("You rolled a " + roll);
}

要模拟更多的掷骰子,您可以在 for 循环中添加上述逻辑,该循环可运行任意数量的循环。

答案 1 :(得分:0)

为具有特定分布的随机变量生成值通常是这样工作的:

  • 您有一个生成随机 0 <= q < 1 的函数,
  • 您应用 quantile function 并获得变量的值。

在您的情况下,您有一个离散随机变量。您需要一个 Random 实例:

private static final Random random = new Random();

变量假定的值:

private static final double[] values = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0};

计算这些值的累积分布函数(值的概率总和直到特定值):

private static final double[] cdf = {1.0 / 9, 2.0 / 9, 3.0 / 9, 4.0 / 9, 5.0 / 9, 1.0};

您的随机生成函数将返回 cdf 不大于 q 的最后一个值:

   public static double randomValue() {
      double q = random.nextDouble();
      for (int i = 0; i < values.length; i++) {
         if (q > cdf[i]) continue;
         return values[i];
      }
      throw new IllegalStateException();
   }

答案 2 :(得分:0)

看起来很简单:

// Pass in an instance of class Random
public static int gen(Random r) { 
  int i = r.nextInt(9); // uniformly generate 0,...,8 inclusive
  if (i < 5) {
    return i + 1;       // returns 1,...,5 w/ probability 1/9
  } else {
    return 6;           // returns 6 w/ probability 4/9
  }
}

警告,我的机器上不再有 Java 编译器,所以我还没有编译它。然而,该算法在另一种语言中是有效的。