这是参考实现,我不明白为什么选择21这里?感谢。
public static int rand7() {
while (true) {
int num = 5 * (rand5() - 1) + (rand5() - 1);
if (num < 21) return (num % 7 + 1);
}
}
顺便说一句,我在问之前读过这个问题,我的具体问题是为什么在这里使用21。在那个帖子中,没有回答。如果我错过了什么,请随意纠正。谢谢。 :)
提前致谢,
林
答案 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
)以产生均匀分布。