可扩展的偏置随机数生成器 - Python
我正在尝试制作一个随机数生成器,它会根据输入的数字,生成一个可能接近的数字。现在我有的代码是这样的:
def biasedRandom(rangen, rangex, target, biaslevel=1):
if rangen > rangex:
raise ValueError("Min value is less than max value.")
return
if not target in range(rangen, rangex):
raise ValueError("Bias target not inside range of random.")
return
num = random.randint(rangen, rangex)
for i in range(biaslevel):
distance = abs(num - target)
num -= random.randint(0, distance)
return num
这个方法效果还不错,不过有时候会生成一些完全不合理的数字;比如说,它曾经在输入 (1,100,30,60)
时,输出了 -246174068358
。我觉得里面可能有个我没发现的bug。
提前谢谢你们的帮助。
2 个回答
0
在计算 num 的最后一行,你是不是在想类似这样的东西呢?
num = abs(num - random.randint(0,distance))
4
使用raise会让函数停止运行,所以后面不需要再加return。
用target in range(lo, hi)这种写法效率不高;为什么不直接用lo <= target < hi呢?
编辑:
import random
def biasedRandom(lo, hi, target, steps=1):
if lo >= hi:
raise ValueError("lo should be less than hi")
elif target < lo or target >= hi:
raise ValueError("target not in range(lo, hi)")
else:
num = random.randint(lo, hi)
for i in range(steps):
num += int(random.random() * (target - num))
return num
当steps增加时,这个方法会很快接近目标值;你可能需要做一些试验分布,确保得到的结果是你预期的,或者可以尝试使用random.gauss来代替。