Leetcode 470 经典面试题用Rand7()实现rand10()

已有方法 rand7 可生成 1 到 7 范围内的均匀随机整数,试写一个方法 rand10 生成 1 到 10 范围内的均匀随机整数。

不要使用系统的 Math.random() 方法。

 

开胃小菜,用rand7 实现rand5怎么做?

rand7 等概率生成1-7,如果出现,6和7,那么拒绝,重新roll,这样就可以等概率生成1-5.

 

下面是用rand7实现rand10.

利用一个七进值的结论:

(rand(7)-1)*7 + rand(7)-1 可以等概率生成[0,48]的数

(rand(7)-1)*7 + rand(7) 可以等概率生成[1,49]的数。

 

为了生成rand10,那我们当然可以超过10就拒绝,小于10就接受,但是这样的性能太差了。

为了优化,我们取一个%10后等概率的最小的数。这个数显然就是40,超过40就拒绝,再来

(idx-1)可以等概率产生0到39的数,(idx-1)%10+1 可以等概率产生0到10的随机数。

class Solution {
public:
    int rand10() {
        int num;
        do{
            int a = rand7();
            int b = rand7();
            num = (a-1)*7+b;       // 根据进位制知识。随机生成1到49的随机数
        }while(num>40);            // [1到40]
        return (num-1)%10+1;       
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值