是否有一种简单的算法可以打印掷骰子的结果,使得获得 1、2、3、4、5 的概率为 1/9,获得 6 的概率为 3/9。
我想在 Java 中实现这一点,并且有意只使用 Math.random()、if 语句、for/while 循环。
答案 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
的函数,在您的情况下,您有一个离散随机变量。您需要一个 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 编译器,所以我还没有编译它。然而,该算法在另一种语言中是有效的。