如何从两个随机数<= 5生成随机数&lt; = 7?

时间:2015-10-03 03:38:21

标签: algorithm random

这是参考实现,我不明白为什么选择21这里?感谢。

public static int rand7() {
    while (true) {
        int num = 5 * (rand5() - 1) + (rand5() - 1);
        if (num < 21) return (num % 7 + 1);
    }
}
顺便说一句,我在问之前读过这个问题,我的具体问题是为什么在这里使用21。在那个帖子中,没有回答。如果我错过了什么,请随意纠正。谢谢。 :) 提前致谢, 林

1 个答案:

答案 0 :(得分:2)

这是因为21是7的倍数。

术语5 * (rand5() - 1) + (rand5() - 1)生成[0, 24]范围内的数字(均匀分布)。然后,这会用[0, 6] % 7创建一个随机数。但是,如果使用整个范围,则不会产生均匀分布。剩余部分0,1,2,3比剩余部分4,5,6多出现一次。因此,产生这些剩余部分之一的相应数字被切断,只有范围[0, 20]< 21 ) 用来。您可以等效地切断前4个数字(> 3)以产生均匀分布。