【发布时间】:2011-08-06 13:56:04
【问题描述】:
我理解了使用拒绝抽样的解决方案,即
public static int rand7() {
while (true) {
int num = 5 * (rand5() - 1) + (rand5() - 1);
if (num < 21) return (num % 7 + 1);
}
}
但我正在考虑另一种解决方案,即 rand5() 被调用 7 次,结果除以 5,但我不确定这是否正确。请让我知道是否存在。
public static int rand7() {
int num = rand5()+rand5()+rand5()+rand5()+rand5()+rand5()+rand5();
return num/5;
}
编辑:看起来生成 1 的概率是 (1/5)^7,但生成 2 的概率是 7*(1/5)^7。它不均匀,因此无法正常工作。
【问题讨论】:
-
在我看来这应该可以工作,因为应该调用
rand5()任何大于或等于 7 的次数(在sum中累积结果),然后将(sum % 7) + 1作为结果。 -
@aroth,这行不通。假设你做了两次。您会在 (1, 10) 范围内获得一个随机值。那么 1、2 和 3 的概率将高于 4、5、6、7。
-
@Paul R:不是完全重复的。这个问题是关于您引用的问题中未提供的解决方案的准确性。
-
@aroth 如果没有指定分布,通常暗示它是统一的。
return 4只是非均匀分布的一个极端情况。 -
1 到 5 之间的每个数字已经 1 到 7 之间的数字。trollface.jpg