由rand7()均匀生成rand10()

 转载至: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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值