给定RAND5,写出RAND7

来源:互联网 发布:nginx tomcat 子域名 编辑:程序博客网 时间:2024/05/22 13:26
描述:给定能随机生成整数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;        }    }}