【发布时间】:2013-06-04 06:20:00
【问题描述】:
我想知道如何编写一个更有机会掷出 6 的骰子? 我已经尝试了一切,但我无法弄清楚算法。 六的概率由用户给出。
我现在只是不知道如何编程random,它使用给定的概率掷出 6 或 1-5。
【问题讨论】:
标签: java algorithm probability dice
我想知道如何编写一个更有机会掷出 6 的骰子? 我已经尝试了一切,但我无法弄清楚算法。 六的概率由用户给出。
我现在只是不知道如何编程random,它使用给定的概率掷出 6 或 1-5。
【问题讨论】:
标签: java algorithm probability dice
将区间 (0,1) 的剩余部分取出,将大小为 6 概率的区域分成 5 个相等的部分,并将这些区域分配给 1 - 5:
/**
* @param pSix probability that a six is returned
* @param rnd Random instance
* @return a random integer between 1 and 6 with 1-5 equiprobable and P(6) = pSix
*/
public int loadedDice(final double pSix, final Random rnd) {
final double pOther = (1d - pSix) / 5d;
final float val = rnd.nextFloat();
if (val < pSix) {
return 6;
}
return (int) Math.ceil((val - pSix) / pOther);
}
}
【讨论】:
我建议使用基于百分比的方案。让用户选择一个六的概率,在这个例子中让我们说 30%。然后在 0-1.0 之间选择一个随机数(这是 java 的 Random#nextFloat 所做的)。如果低于或等于.3,则设为 6,否则设为 1-5。
Random r = new Random();
float probability = r.nextFloat(); // get a value between 0 and 1
if (probability < probabilityOfSix){
return 6;
} else {
return r.nextInt(4) +1;
}
【讨论】:
probability < probabilityOfSix,否则 0 的概率实际上是 1600 万分之一。
假设 6 出现的概率是两倍。得到一个从 1 到 7 的随机数,如果你的结果是 6 或 7,那么你就是 6。
三倍的概率发生同样的事情。取一个1-8的随机数:6、7、8变成6。
【讨论】: