带负权重的随机选择
在我的Python程序中,我有三个变量 a
、b
和 c
。它们都是浮点数,可以是正数也可以是负数,没有上下限。
我想写一个函数,能够把这三个变量当作权重,然后随机选择一个对应的动作(A
、B
和 C
)。我该怎么做呢?
举个例子:
a = 10
b = -2
c = 7
这个函数应该大多数时候执行 A
,有时执行 C
,而 B
则是最少执行的。
我在这个网站上找到的“加权随机函数”都不支持负权重。
4 个回答
-4
你可以把负数转换成数字。可以把这些数字变成在[0;1]这个范围内的数,方法如下:
def chance(a):
if a>0:
return a
else:
return 1/abs(a)
另外,当输入是0的时候,你也应该返回一些东西。
-2
我只是随便想想,如果你把权重加起来会怎么样。比如你加上19和4(B阳性是2,差值是4),再加上7,结果就是30。
chanceA = 19 / 30 = 63%
chanceB = 2 / 30 = 6%
chanceC = 7 / 30 = 23%
如果你把百分比加起来,可能不会得到100%,但也许这样做是可行的 :)
1
好吧,有个简单的方法就是假设你的变量值来自一个正态分布,这个分布的mean
(平均值)设为最大值(*),标准差可以随便定,比如sd=1
。
接下来,你需要做的就是找出某个特定值,比如-2
出现的概率,这个可以通过概率分布函数(pdf)来解决。然后你可以把这些概率当作权重来使用。
这个方法的好处是,你也可以处理负值。
解决方案:
import scipy.stats
variables = [10, -2, 7]
maximum = max(variables)
probabilities = scipy.stats.norm(maximum, 1).pdf([variables])
结果: array([[ 3.98942280e-01, 2.14638374e-32, 4.43184841e-03]])
剩下的你可以自己想办法解决。
(*) 把mean
设为最大值的原因是为了让它的概率(权重)最大。
2
weights = [10, -2, 7]
offset = min(weights)
positiveweights = [z - offset + 1 for z in weights]
现在你可以使用任何需要正权重的加权随机函数。