leetcode -470 用 Rand7() 实现 Rand10()

在这里插入图片描述

算是数学问题:
现在已经给你了一个rand7(),可以随机生成一个[1,7]的数字.
现在在这个基础上面,生成随机数rand10()

int a=rand();//1,2,3,4,5,6,7 但是这里面8,9,10表达不了
int b=rand()*7;//7,14,21,28,35,42,49 这里结尾的有 1,2,3,5,7,8,9。还是不连续,而且缺少数字了
int b=(rand()-1)*7;//7,14,21,28,35,42,49 这里结尾的有0,1,2,3,5,7,8。 还是不连续

我们再去关注一下,我们当前的问题导向:我们希望生成1,2,3,4,5,6,7,8,9且等概率
我们再去盲做一下:

int b=(rand()-1)*7+rand7();//7,14,21,28,35,42,49 这里结尾的有 1,2,3,5,7,8,9。

ps:前后的两个rand7()的随机数都是随机生成的

这样就有点散射的感觉,而且个位数都有出现123456789
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 ......
29 ......
36 ......
43 ......

然后我们此时生成了[1,49]所有的数字了

那么我们只要41~49中的数字

那么代码就很好写了:
代码如下:

// 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 rand49=(rand7()-1)*7+rand7();
        return rand49>40?rand10():rand49%10+1;
    }
};

还有更流氓的写法:也不知道怎么想到的:

// 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 a=rand7(),b=rand7();
         while(a==7) a=rand7();
         while(b>5) b=rand7();

        // //a&1?表示的是返回的是偶数

         return (a&1?0:5)+b;

    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值