带负权重的随机选择

3 投票
4 回答
2332 浏览
提问于 2025-04-26 12:30

在我的Python程序中,我有三个变量 abc。它们都是浮点数,可以是正数也可以是负数,没有上下限。

我想写一个函数,能够把这三个变量当作权重,然后随机选择一个对应的动作(ABC)。我该怎么做呢?

举个例子

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]

现在你可以使用任何需要正权重的加权随机函数。

撰写回答