LeetCode 470. Implement Rand10() Using Rand7()

题意:已知一个函数可以uniformly randomly产生1-7,由此构造一个函数可以uniformly randomly产生1-10。

首先rand7()+rand7()%4无法保证uniform,因为rand7()%4产生的0-3的概率就不是uniform的。这可以把rand7()和rand7()%4产生的所有组合列出来看一下,看看每个sample出现次数是否相等。

用两个rand7()进行加减操作,将1-10 map到一个Discrete space中且sample出现的次数相等。可以构造x(rand7()-1)+rand7(),因为还需要保证1,2,...,7出现,所以前面一项需要有一定的概率出现0,前面一项=1时,总和不能和1,...,7重合,所以x*1+1=8,then x=7.所以构造7*(rand7()-1)+rand7()即可。

另外,7*(rand7()-1)+rand7()产生的序列是1,2,...,49,mod 10的话,41-49是只能包括1-9,无法保证1-10每个都出现一次,是多余的,所以如果产生了41-49的数就要skip,重新random。这就相当于re-scale了probability,mask了invalid sppearance (41-49),所以仍然是uniform的。这种方法也叫rejection sampling。

// 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() {
        while(true)
        {
            int tmp=7*(rand7()-1)+rand7();
            if(tmp<=40)
            {
                return tmp%10+1;
            }
        }
    }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值