晓轩

博客园 首页 联系 订阅 管理

给定能随机生成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;
}

posted on 2013-06-13 20:43  晓轩  阅读(267)  评论(0)    收藏  举报