我试图得到一个随机数生成器,它会偏向于需要一个数字,并打印一个可能接近的数字。这就是我现在所拥有的:
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
这很好用,但它有时会给出完全无耻的数字;例如它曾为-246174068358
提供了(1,100,30,60)
。我认为那里只有一个我没有看到的错误。
提前致谢。
答案 0 :(得分:4)
raise退出该函数 - 你不需要跟随return返回
范围内的目标(lo,hi)是低效的;为什么不lo< = target<喜?
修改强>
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
随着步骤的增加,这将很快收敛到目标;您可能希望进行一些试验分发,以确保获得预期,或尝试使用random.gauss。
答案 1 :(得分:0)
在计算num的最后一行,您是否在考虑这样的事情?
num = abs(num - random.randint(0,distance))