给定能随机生成1到5的函数,写出能随机生成1到7的函数
算法实现:拒绝采样法,生成目标范围的随机数,即生成满足题目要求的样本空间,5<7<5*5,只需两次调用rand_5(),可产生25个样本空间分别和1--25个正整数一一映射,为了保证等概率,22,23,24,25舍去;如图所示:1--7中的每个数在样本空间出现的概率为3/25, 所以它们等概率出现的概率就为1/7了,如图所示,算法实现如下:
1 2 3 4 5
1 1 2 3 4 5
2 6 7 1 2 3
3 4 5 6 7 1
4 2 3 4 5 6
5 7 * * * *
#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;
int rand_5()
{
return rand()%5+1;
}
int rand_7()
{
int row,col,idx;
do
{
row=rand_5();
col=rand_5();
idx=col+(row-1)*5;
}while(idx>21);
return 1+(idx-1)%7;
}
int main()
{
int T;
srand((unsigned)time(NULL));
cin>>T;
while(T--)
{
cout<<rand_7()<<endl;
}
return 0;
}
浙公网安备 33010602011771号