《算法导论》5.1-2

要想使用random(0,1)生成(a,b)之间的随机数,可以进行以下步骤:

1.相当于实现random(0,b-a)之间的随机数

2.但是0101等序列数字直接相加得到的数字概率不等,用二进制这样每个位上出现01的概率就相等,换言之生成的二进制数概率相等,再将二进制转化为十进制即可

3.具体做法就是先找出大于b-a的最小2的n次方,即二进制的位数范围,确定位数后每位进行01随机的生成,转为十进制数,如果出现超出b-a的情况重新生成即可。

python代码如下:

# 将random(0,1)变为random(a,b)
from random import *


def reverse(a, b):

    dist = b - a
    # 找到大于b-a的最小2的n次方
    c = 0
    while 2 ** c <= dist:
        c += 1

    sum = 0
    for i in range(c):
        sum = sum + randint(0, 1) * 2 ** i  # 二进制变十进制
        # sum += randint(0, 1) << i
    if sum <= dist:
        return sum + a
    else:
        return reverse(a, b)

if __name__ == "__main__":
    a = 5
    b = 6
    for j in range(200):
        print reverse(a, b)

猜你喜欢

转载自blog.csdn.net/xuqn0606/article/details/81738410