leetcode题470:等概率生成随机数

这篇博客介绍了如何通过构造0、1的二进制序列,利用rand7()生成1-10之间的随机数。作者分享了代码实现,包括一个核心的rand10()函数,它通过多次调用rand_01()来生成等概率的01序列,并最终组合成1-10范围内的随机整数。此外,还提供了一个辅助函数rand_01(),用于从rand7()的返回值中提取0或1。这种方法展示了巧妙地利用随机数生成技巧。
摘要由CSDN通过智能技术生成

此题是9.5日的每日一题,还是挺有趣的。一开始想的是利用两个随机数进行操作,然后获取结果进行一些操作,但是关键难度在于如何构造这个操作,其中需要一些技巧。后来看了题解,发现用二进制的方法来的更加直观巧妙,这里来贴一下我写的代码,顺便理一下思路。

我们的主要思路就是构造0、1的二进制序列。因为我们要生成1-10的数据,而数据10的二进制位为1010,数据1的二进制位0001,所以我们只要保证随机生成的0或者1是等概率的即可,这里就可以利用rand7()来进行生成01,当rand7生成的在1-3范围内,就为0,在4-6之内,就位1即可。

代码如下:

/**
 * The rand7() API is already defined in the parent class SolBase.
 * public int rand7();
 * @return a random integer in the range 1 to 7
 */
class Solution extends SolBase {
    public int rand10() {
        int res=1;
        while(true){
            res = (rand_01()<<3) + (rand_01()<<2) + (rand_01()<<1) + rand_01();
            if(res>=1 && res<=10) break;
        }
        return res;
    }

    //生成一个等概率01的数据
    public int rand_01(){
        int res=0;
        int tmp=1;
        while(true){
            tmp = rand7();
            if(tmp==7) continue;
            else{
                if(tmp>=1 && tmp<=3) res=0;
                else if(tmp>=4 && tmp<=6) res=1;
                break;
            }
        }
        return res;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小吴同学GOGOGO

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值