要想使用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)