470. 用 Rand7() 实现 Rand10()
思路: 7 < 10
我们需要扩充Rand7(),让使用Rand7()组合成的RandX的范围大于Rand10()。
(此处RandX()范围均为[1-X])
如何扩充?
1 Rand7() + Rand7()。
产生的结果是在1-14正太分布,不符合
2 Rand7() * Rand7()
产生的结果是在1-49正太分布,不符合
3 (rand7()-1) × 7 + rand7()
可以等概率的生成1-49的数字
已知 rand_N() 可以等概率的生成[1, N]范围的随机数 那么: (rand_X() - 1) × Y + rand_Y() ==>
可以等概率的生成[1, X * Y]范围的随机数 即实现了 rand_XY()
采用拒绝采样,只选取1-40,并将其平均分成10分,如果产生的结果不在1-40中,则重新采样
时间复杂度:期望时间复杂度为 O(1),但最坏情况下会达到 O(∞)(一直被拒绝)。
空间复杂度:O(1)。
import java.util.Random;
/**
* 470. 用 Rand7() 实现 Rand10()
*
*/
public class Solution470 {
private Random random = new Random();
public int rand10() {
int res = rand49();
while (res > 40) {
res = rand49();
}
return (res - 1) % 10 + 1;
}
private int rand49() {
return rand7() + (rand7() - 1) * 7;
}
private int rand7() {
return random.nextInt(7) + 1;
}
}