Given a function rand7
which generates a uniform random integer in the range 1 to 7, write a function rand10
which generates a uniform random integer in the range 1 to 10.
Do NOT use system's Math.random()
.
以下推导极为重要
// 生成1-10之间随机数 利用rand7
// (randN-1)*N+randN 可以得到rand(N^2)
// 更一般的有 N^m*(randN-1)+N^m-1*(randN-1)
// 由rand7 -> rand49 ->rejection sample->rand40-> rand40%10+1 ->rand10
// 如果对rand49直接取模 分布会不均(如果是rand40就没问题 因此先用拒绝采样得到一个rand40)
class Solution {
public:
int rand10() {
// 由于是拒绝采样落在40-49间是不会反悔的
while(true){
int num = 7*(rand7()-1)+rand7();
if(num<=40){
return num%10+1;
}
}
}
};