2014-10-09 98 views
0

在我的python程序中,我有三个变量a,bc。它们都是浮动的,可能是正面的或负面的,没有上下限。负重随机选择

我如何去制定一个函数,这些变量作为权数,并随机选择一个相应的动作(AB & C)?

a = 10 
b = -2 
c = 7 

的功能应该执行A大部分时间,C一些时间和B最少的方式。

我在这个网站上找到的'加权随机函数'不处理负权重。

+0

什么*是负重量? (在这种情况下)是没有意义的。 – 2014-10-09 07:50:33

+0

-2是负重 – 2014-10-09 07:50:51

+0

@VincentBeltman:不,这是一个*示例*。 – 2014-10-09 07:51:16

回答

0
weights = [10, -2, 7] 
offset = min(weights) 
positiveweights = [z - offset + 1 for z in weights] 

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

-2

只是我的想法,如果你总结重量。你会得到19 + 4(B正面是2,diffrence 4)+ 7 = 30

chanceA = 19/30 = 63% 
chanceB = 2/30 = 6% 
chanceC = 7/30 = 23% 

如果你总结procentages你没有得到100%,但是,它可能会工作:)

+0

如果b是3并且c是-7这会导致C具有更大的权重,这是错误的 – medakk 2014-10-09 08:02:41

+0

Ups,你是对的。然后 – Jure 2014-10-09 08:04:44

-3

您可以将负数转换为数字。到[0; 1]段中的数字。这样

def chance(a): 
    if a>0: 
     return a 
    else: 
     return 1/abs(a) 

,你也应该在0

+0

-1将被视为100%。另外-2和+0.5最终会有相同的机会 – medakk 2014-10-09 11:35:30

0

那么返回的东西,一个简单的方法是假设你的变量的值来自与mean等于最大值正态分布(*)和一个任意的标准偏差(例如sd=1)。

然后,您需要做的仅仅是找到看到诸如-2一个特定的值,可以通过概率分布函数(PDF )来解决的可能性。然后你可以使用概率作为权重。

这种方法的好处是你也可以有负值。

解决方案:

import scipy.stats 
variables = [10, -2, 7] 
maximum = max(variables) 
probabilities = scipy.stats.norm(maximum, 1).pdf([variables]) 

结果: 阵列([[3.98942280e-01,2.14638374e-32,4.43184841e-03]])

其余的,就可以弄清楚你自己。

(*)将mean设置为最大值的原因是为了获得最大的概率(权重)。

+0

我想“任意”(大声笑?真的?)标准差对结果概率有一个*大*的影响,所以你可能:)必须玩直到你对结果满意为止。 'e-32'肯定听起来不对。 – 2014-10-09 13:31:35