c语言根据概率生成随机数_零零碎碎——如何使用rand5()生成rand7()?

6f525f73da3cc8c38f533fea519ea031.png

Notation

  • rand5()能够生成0-4的随机数
  • rand7()能够生成0-6的随机数

已知rand7()生成rand5()

方法比较简单,只需要不断生成0-6的随机数,小于5则返回即可

int rand5()
{
  int res=rand5();
  while(res>4)
  {
    res = rand5();
  }
  return res;
}

已知rand5()生成rand7()

这里就要考虑如何使用rand5()生成大于4的随机数 - 简单的使用rand5()×2之类的操作肯定是不行了,这只会让随机数由0-4变成0,2,4,8 - 使用rand5()+rand5()呢?似乎确实覆盖了0-8,但是0-8数字概率并不均衡,例如0的可能只有0+0,但是2的可能有1+1,0+2,2+0三种,因此并不是真的均匀随机 - 综上,使用rand5()+rand5()×5,rand5()是0,1,2,3,4的随机,rand5()×5是0,5,10,15,20的随机,因此对于0-24的所有数字的取样,都是等概率的,其实对于任意randn(),都可以通过randn()×n+randn()来扩展随机数范围

然而问题并没有结束,尽管我们生成了一个rand25(),但采用上述方法获取rand7()会消耗大量的时间,因此不能消极等待小于7的随机数的出现。

我们想到,可以使用rand25()%7来得到rand7(),但是这样又会导致概率不均衡,因此采用rand25()来生成rand21(),这个21是根据$25/7*7$计算得到,再用rand21()对7取余来生成rand7(),代码如下:

int rand7()
{
  int res = rand5()*5 + rand5();
  while(res>20)
  {
    res = rand5()*5 + rand5();
  }
  return res%7;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值