可扩展有偏数字生成器-Python

可扩展有偏数字生成器-Python,python,random,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, ra

我试图得到一个随机数生成器,它会有偏差,因为它需要一个数字,并打印一个可能接近的数字。以下是我现在拥有的:

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
这种方法效果很好,但有时会给出完全不合理的数字;e、 g.它曾为
(1100,30,60)
给出
-246174068358
。我觉得里面有一个我看不见的虫子


提前感谢。

raise退出该功能-您不需要跟随raise返回

射程内目标(低、高)效率低;为什么不lo=hi: 提升值错误(“lo应小于hi”) elif目标<低或目标>=高: raise VALUERROR(“目标不在范围内(低,高)”) 其他: num=random.randint(低,高) 对于范围内的i(步): num+=int(random.random()*(target-num)) 返回数
随着步长的增加,这将非常迅速地收敛到目标上;您可能希望进行一些试用分发,以确保得到预期的结果,或者尝试使用random.gauss。

raise退出函数-您不需要跟随raise返回

射程内目标(低、高)效率低;为什么不lo=hi: 提升值错误(“lo应小于hi”) elif目标<低或目标>=高: raise VALUERROR(“目标不在范围内(低,高)”) 其他: num=random.randint(低,高) 对于范围内的i(步): num+=int(random.random()*(target-num)) 返回数
随着步长的增加,这将非常迅速地收敛到目标上;您可能希望进行一些试验分布,以确保得到预期的结果,或者尝试使用random.gauss来代替。

在计算num的最后一行中,您是否考虑过类似的问题

    num = abs(num - random.randint(0,distance))

在计算num的最后一行中,您是这样想的吗

    num = abs(num - random.randint(0,distance))

如果
num
小于
target
,您不想将其添加到
num
,而不是始终进行减法吗?假设你第一次得到1,那么如果你再从中减去60次,结果就不那么离谱了。顺便说一句:在
提高后
没有必要返回
:它永远不会达到。一定是这样,我还在考虑差异,总是减法。如果小于
target
,您不想添加到
num
,而不是总是减法吗?假设你第一次得到1,那么如果你再从中减去60次,结果就不那么离谱了。顺便说一句:在
加薪之后,没有必要返回
:它永远不会到达。一定是这样,我还在考虑差异,你总是在减法。我不认为这是完全正确的。这可能是我写这篇文章时潜意识里认为我在做的事情,但我认为真正的答案在于天气
num
我不认为是这样。这可能是我写这篇文章时潜意识里认为我在做的事情,但我认为真正的答案在于天气
num
我喜欢这个解决方案;非常干净。我刚才的快速测试表明,虽然它很快接近目标,但它永远不会真正达到目标。我用
round()
代替了循环中的
int()
,这似乎效果更好;非常干净。我刚才的快速测试表明,虽然它很快接近目标,但它永远不会真正达到目标。我在循环中使用
round()
而不是
int()
,这样做似乎效果更好。