转载至:https://blog.csdn.net/BIT_666/article/details/84936793
概述
已知随机数生成函数rand7()可以生成整数1-7之间的均匀分布,如何使用rand7()构造rand10(),使rand10()可以生成整数1-10的均匀分布
分析
要保证rand10()生成的随机数是1-10的均匀分布,可以先产生1-10*n的均匀分布,假设x是1-10*n区间上的一个随机数,那么x%10+1就是均匀分布在1-10区间上的整数,下面就用rand7()去生成1-10*n的均匀分布
步骤
A事件:rand7()产生{1,2,3,4,5,6,7}的离散集合中的一个,所以rand7()-1产生{0,1,2,3,4,5,6},每个数字的产生的概率为1/7
B事件:(rand7()-1)*7产生{0,7,14,21,28,35,42},其中每个数字产生的概率为1/7
A,B事件相互独立:所以(rand7()-1)*7+rand7()生成1-49之间的随机数,且概率均为1/7 * 1/7 = 1/49,即均匀分布
截取10的整数倍数:1-49是均匀分布的,所以1-40也是均匀分布的,所以截取1-40之间的数,执行x%10+1即可满足要求
#include <iostream>
#include<random>
using namespace std;
int rand7(){
return rand()%7+1;//1,...,7
}
int rand10(){//1,...,10=>1,..,10*n=>num%10+1
return ((rand7()-1)*7+rand7())%10+1;
}
int main()
{
int n=20;
while(n--)
cout<<rand10()<<" ";
return 0;
}