用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的概率为 27 * 17, 同理第三次返回1的概率为 (27)^2 * 17, 按等比数列求极限和可得为 15, 因为可以使用大数生成较小数的随机数

对于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