可扩展的偏置数字生成器 - Python

时间:2011-02-13 02:52:54

标签: python random

我试图得到一个随机数生成器,它会偏向于需要一个数字,并打印一个可能接近的数字。这就是我现在所拥有的:

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)。我认为那里只有一个我没有看到的错误。

提前致谢。

2 个答案:

答案 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))