描述:给定能随机生成整数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
这个题网上有很多各种各样的答案,但是感觉都不太科学。做为一个学统计的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;
}
}
}