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

1 投票
2 回答
1166 浏览
提问于 2025-04-16 11:43

我正在尝试制作一个随机数生成器,它会根据输入的数字,生成一个可能接近的数字。现在我有的代码是这样的:

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来代替。

撰写回答