题意要求用rand7来生成rand10,也就是用随机的1-7来模拟随机的1-10.可以使用两次rand7随机生成一个七进制的两位数,之后进行划分,
模拟随机的1-10,下面的解法1就是使用了这种解法,随机生成了1-40之间的数字,然后取模+1就可以了。
//解法1
class Solution {
public:
int rand10() {
int n = (rand7()-1)*7+rand7();///1-49
if(n > 40) return rand10();///继续生成1-40间的数字
return (n-1)/4+1;///生成结果,先映射到0-39,在缩放到1-10.
}
};
参考了leetcode网站上lee大佬的神奇的解法:假设我们有一个非常大的随机数,那么我们每次从它里面读到一个按照
10进制解释的最低位,那么这一位也应该是随机的。
//解法2
class Solution {
int num = 0;
public:
int rand10() {
while(num <= 100000000) num = num*7 + rand7();
int res = num%10+1;
num /= 10;
return res;
}
};
浙公网安备 33010602011771号