题意要求用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;
    }
};
posted on 2022-05-06 20:01  Dingo1997  阅读(71)  评论(0)    收藏  举报