2014-10-09 123 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