参考题解:
题目描述:
题目分析:
通过对 rand2() 来生成 rand4() 可以发现用 ( rand2() - 1 ) * 2 + rand2() 可以
所以可以得到规律 :
已知 rand_N() 可以等概率的生成[1, N]范围的随机数
那么:
(rand_X() - 1) × Y + rand_Y() ==> 可以等概率的生成[1, X * Y]范围的随机数
即实现了 rand_XY()
那么 rand7() 可以生成 1-7 的随机数
现在 用 rand7() 就可以生成 1-49 的随机数
又因为要生成 1- 10 的随机数,所以需要舍弃41 - 49 这9个数字,然后 % 10 + 1即可
优化
我们舍弃了 9 个数,能否舍弃的更少呢,因为这 9 个数是等概率出现的,所以 相当于有了 rand9()
那么通过 rand9() 和 rand7() 就又可以生成 rand63() 这时 只需要 舍弃 3 个数就行了
然后rand3() 和 rand7 又可以更进一步的生成 rand21() 这样就只需要舍弃一个就好了,更进一步的优化了时间复杂度
代码和结果:
// The rand7() API is already defined for you.
// int rand7();
// @return a random integer in the range 1 to 7
class Solution {
public:
int rand10() {
int curr;
while (true)
{
curr = (rand7() -1 )*7 + rand7();// rand49();
if(curr <= 40) break;
int t = curr%10;// rand9();
curr = (rand7() - 1) * 7 + t;// rand63();
if(curr <= 60) break;
t = curr%10;// rand3()
curr = (rand7() - 1) * 7 + t;// rand21();
if(curr <= 20) break;
}
return 1 + curr % 10;
}
};