用rand5模拟rand7
rand5 函数可以等概率随机产生1-5五个数, 要求用 rand5 模拟出rand7.
考虑以rand7 实现rand5
def rand5():
res=6
while(res>5):
res=random.randint(1,7)
return res
验证是否生成的数字是等概率生成1-5. 假设第一次返回1, 概率为1/7, 第二次返回1, 那么第一次生成的必为6或7, 返回1的概率为 2⁄7 * 1⁄7, 同理第三次返回1的概率为 (2⁄7)^2 * 1⁄7, 按等比数列求极限和可得为 1⁄5, 因为可以使用大数生成较小数的随机数
对于randA 和randB 只要A>B, 就可以使用randA生成randB
def randB():
res= (max int)
while(res > B):
res = RandA()
因此对于rand5 需要让其生成的数范围大于7即可, 同时扩大后的每个数出现时等概率的
def rand7():
res=~(1<<31)
while (res>7):
res=5 * (random.randint(1,5)-1) + random.randint(1,5)
return res
Rand5产生1到5的数,减1就产生0到4的数,乘以5后可以产生的数是:0,5,10,15,20。 再加上第二个Rand5()产生的1,2,3,4,5。我们可以得到1到25, 而且每个数都只由一种组合得到
上式存在一个缺点就是产生的大部分数都被舍弃了, 做更改
def rand7():
res=~(1<<31)
while (res>21):
res=5 * (random.randint(1,5)-1) + random.randint(1,5)
return res % 7 + 1
通用公式: 对于给定用randa 模拟randb, a < b
def randB():
res= ~(1<<31)
while(res > B):
Randa2 = a * (Randa – 1) + Randa
return res