public int rand10() {
int a, idx;
while (true) {
a = rand7();
idx = rand7() + (a - 1) * 7; // [1...49]
if (idx <= 40) {
return (idx - 1) % 10 + 1;
}
a = idx - 40; // [1...9]
idx = rand7() + (a - 1) * 7; // [1...63]
if (idx <= 60) {
return (idx - 1) % 10 + 1;
}
a = idx - 60; // [1...3]
idx = rand7() + (a - 1) * 7; // [1...21]
if (idx <= 20) {
return (idx - 1) % 10 + 1;
}
// 这里idx值只能是21 直接跳过
}
}
rand7() 产生的数字范围是 [1, 2, 3, 4, 5, 6, 7]
rand7()-1 [0, 1, 2, 3, 4, 5, 6]
(rand7() - 1)*7 (必须是乘以7,乘以其它数字就不能保证 #产生所有数字且数字是等概率的#)
(rand7() - 1)*7 产生的数字范围是 [0, 7, 14, 21, 28, 35, 42]
(rand7() - 1)*7 + rand7() [1, ... 49]
1 到 49是由 rand7() 和 (rand7() - 1)*7 两两组合而成, 则产生 1到49之间的数字是等概率的
(rand7() - 1)*7 中 取 0 , 能和rand7() 组合成 [1, 2, 3, 4, 5, 6, 7]
(rand7() - 1)*7 中 取 7 , 能和rand7() 组合成 [8, 9, 10, 11, 12, 13, 14]
(rand7() - 1)*7 中 取 14 , 能和rand7() 组合成 [15, 16, 17, 18, 19, 20, 21]
(rand7() - 1)*7 中 取 21 , 能和rand7() 组合成 [...]
(rand7() - 1)*7 中 取 21 , 能和rand7() 组合成 [...]
(rand7() - 1)*7 中 取 35 , 能和rand7() 组合成 [...]
(rand7() - 1)*7 中 取 42 , 能和rand7() 组合成 [43, 44, 45, 46, 47, 48, 49]
470. Implement Rand10() Using Rand7()
最新推荐文章于 2021-02-25 18:59:36 发布