如何使用生成1到5的函数在1到7之间生成随机数

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.它是不均匀的,所以它不会起作用.

mer*_*ike 0

虽然其他解决方案将生成 1..7 范围内的随机数,但它会以非均匀概率分布的方式生成,即数字 3 的可能性比数字 1 的可能性大得多。

相反,拒绝抽样方法将以相同的概率返回 1..7 范围内的所有数字。