Implement Rand10() Using Rand7()

Given a function rand7 which generates a uniform random integer in the range 1 to 7, write a function rand10 which generates a uniform random integer in the range 1 to 10.

Do NOT use system's Math.random().

以下推导极为重要

N^{m}(randN-1)+N^{m-1}(randN-1)+...+randN-1=randN^{m+1}-1 


// 生成1-10之间随机数 利用rand7
// (randN-1)*N+randN 可以得到rand(N^2)
// 更一般的有 N^m*(randN-1)+N^m-1*(randN-1)
// 由rand7 -> rand49 ->rejection sample->rand40-> rand40%10+1 ->rand10
// 如果对rand49直接取模 分布会不均(如果是rand40就没问题 因此先用拒绝采样得到一个rand40)
class Solution {
public:
    int rand10() {
        // 由于是拒绝采样落在40-49间是不会反悔的
        while(true){
            int num = 7*(rand7()-1)+rand7();
            if(num<=40){
                return num%10+1;
            }
        }
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值