给一个生成1到5随机数的函数,写一个函数生成1到7的随机数

题目描述和讲解参考https://blog.csdn.net/MDreamlove/article/details/48599107

这里解释一下,rand5能够产生1-5的随机数,要写rand7产生1-7的随机数。注意这里都是需要从1开始,才能用下面的公式。

首先,从rand7是肯定可以生成rand5的,当用rand7的时候,只要出现大于5的数就丢掉,而且经过证明这样生成的rand5是等概率的,证明见链接博客。所以我们只需要用rand5生成比7大的范围就可以了。这里用到了下面的

通用公式

Rand_a2=a*(Rand_a-1)+Rand_a  可生成1-a2的随机数。

如果a2<b,再次套用上面的公式 Rand_a3=a*(Rand_a2-1)+Rand_a2 直到a_*>=b

这里有一点细节参考博客里没有给出,就是b真的比a大很多的时候,一次计算没有算完,那么怎么扩大a的范围,因为Rand是一个函数,难道要函数嵌套函数这样的写吗,肯定没办法实现,所以这里推导一下后面的情况,不过一般也不会推导到后面这么多:

结果变换

经过上面的计算,5*(5-1)+5=25,rand5变成了rand25。我们要求的是1-7之间,但是这样有很多的数都浪费掉了,性能比较低,所以我们可以缩小解的范围,将1-7的限制条件扩充到7的倍数,最大可以扩充到21,即rand25<=21然后将结果做如下变换

rand7=rand25%7+1

可计算,这样会产生3组1-7之间的数,都是等概率产生的。

从0开始的随机数

如果随机数是从0开始的,就要先将rand5加1计算,当成产生1-6之间随机数的函数,计算产生1-8随机数,再减一。实现代码:

import random
# a(): 0-3
def a():
    return random.randint(0,3)
#seven: 0-7
def seven():
    b=a()*4+a()+1
    return b%8

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值