har*_*ddy 5 random algorithm math
可能重复:
将随机范围从1-5扩展到1-7
我理解使用拒绝采样的解决方案,即
public static int rand7() {
while (true) {
int num = 5 * (rand5() - 1) + (rand5() - 1);
if (num < 21) return (num % 7 + 1);
}
}
Run Code Online (Sandbox Code Playgroud)
但我正在考虑另一个解决方案,即rand5()被调用7次,结果除以5,但我不确定这是否正确.如果有或没有,请告诉我.
public static int rand7() {
int num = rand5()+rand5()+rand5()+rand5()+rand5()+rand5()+rand5();
return num/5;
}
Run Code Online (Sandbox Code Playgroud)
编辑:看起来生成1的概率是(1/5)^ 7但生成2的概率是7*(1/5)^ 7.它是不均匀的,所以它不会起作用.
虽然其他解决方案将生成 1..7 范围内的随机数,但它会以非均匀概率分布的方式生成,即数字 3 的可能性比数字 1 的可能性大得多。
相反,拒绝抽样方法将以相同的概率返回 1..7 范围内的所有数字。