给一个生成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

猜你喜欢

转载自blog.csdn.net/gt362ll/article/details/82895591