给定RAND5,写出RAND7

描述:给定能随机生成整数1到5的函数rand5(),写出能随机生成整数1到7的函数rand7()
这个题网上有很多各种各样的答案,但是感觉都不太科学。做为一个学统计的ds,用概率论
的方法来解决这个问题。
先假定给定的函数产生的是均匀分布,即 f(x=i)=1/5  , i=1,2,3,4,5。
假设随机变量x=rand5()*(rand5()-1)
则x的分布为
x   0       1        2        3        4        5        6        8        9        10        12        15        16     20
p  5/25  1/25  2/25   2/25  3/25   1/25  2/25   2/25 1/25   1/25     2/25    1/25     1/25  1/25
可以发现p=1/25的数有7个,其实只要有相同概率的数超过7个就行,记
                                       A={1,5,9,10,15,16,20}
                                       B={1,2,3,4,5,6,7}
做映射     f:A->B        
              f(Ai)=Bi
可以证明这样产生的随机数也是均匀分布的,用条件概率
               p(x=i|x in A)=p(x=i)/p(x=i,x in A)=(1/25)/(1/25)=1/7

则易知rand7()可以如下表示

int rand7() {
    while(1) {
        int x=rand5()*(rand5()-1);
        switch(x) {
            case 1: return 1;
            case 5: return 2;
            case 9: return 3;
            case 10:return 4;
            case 15:return 5;
            case 16:return 6;
            case 20:return 7;
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值