2017-09-05 67 views
0

可以說我有四種貨幣,我想選擇一個隨機:基於一些外部值分佈

Bronze, Silver, Gold, Platinum 

基於一些「評級」的價值,我想的概率分配給每個貨幣因爲它有機會被選中。假設這個評級值是0.0 - 5.0

現在我想重新分配鉑金方面,如果我的評級較高,並且如果我的評級較低,則向銅牌方加權。

所以5.0的得分可能看起來像:

Bronze: 0.0, Silver: 0.10, Gold: 0.30, Platinum: 0.60 

而且同樣的0.0的評級可能看起來像:

Bronze: 0.60, Silver: 0.30, Gold: 0.10, Platinum: 0.0 

的2.5評級可能看起來更均勻地分佈之間的中間匯率。

我真的不能想到一個算法來處理這個問題。我如何根據控制分配的某個值來生成100%的分配?有誰知道我可以從哪裏開始?

+0

'所以評級爲5.0可能看起來像'這種評分是給哪種貨幣?鉑? – axiom

+0

@axiom我只是舉了5.0的評級「加權」分佈的例子。看看鉑金如何被挑選的可能性更高?評級不與任何貨幣配對,對所有貨幣都是分開的,但只是控制分配。 – Brejuro

回答

1

一個微不足道的答案是將4條直線適合您所擁有的數據並稱之爲一天。

更靈活的方法是以任何喜歡的方式定義4個非負相對權重函數,如bronze(r),silver(r),gold(r),platinum(r)。然後你定義了total(r) = bronze(r) + silver(r) + gold(r)+ platinum(r)。現在青銅的概率是bronze(r)/total(r)

這種方法的好處是,你可以玩像這樣的功能:bronze(r) = 4 * 0.3^rsilver(r) = 2 * 0.7^rgold(r) = 1platinum(r) = 0.1 * 1.8^r。而現在在r=0青銅是最有可能的。銀最有可能在r=1。黃金最有可能在r=2。而在r=5鉑是最有可能的。

你應該嘗試各種功能,並解決遊戲中最可玩的任何結果。

+0

非常感謝這個解決方案!這對我來說比實現一些複雜的統計函數容易得多,我也喜歡我可以調整數字以加權來玩 – Brejuro

0

這裏有一些想法/草圖,對此我可能應該受到統計學家的懲罰(至少對於執行)。我假設這不是一個大規模的擬合問題,可能需要其他方法。

總的想法是:使用dirichlet-distribution來生成最終分佈。 dirichlet分佈本身也有參數(見wiki),我們在這裏使用正態分佈,因爲對稱性和只有2個參數需要(我們可以在這裏修正方差,這樣我們只需要一個在任務中定義的變量;方差仍然是一個設計參數來控制這個標量 - > dist函數的映射;實際上,這也可以用作一些1d優化問題中的優化變量,這個問題不是微不足道的,因爲它可能是非凸的,評估函數)作爲定義我們的狄利克雷分佈的內部分佈。

下面是一些示例代碼(蟒蛇),這可能是一個理論上的惡夢,也沒有在numpy的/ SciPy的使用率方面是很好的,但是,嘿,這只是一個例子:

import numpy as np 
from scipy.stats import norm 

def get_sample(param): 
    # location = mean shifted because of the task (symmetry not at zero!) 
    outer_normal = np.array([norm.pdf(x, scale=1, loc=param-2.5) for x in np.linspace(-1, 1, 4)]) 
    # shifting (we need positive reals as dirichlet-input) maybe critical in terms of theory 
    shifted_outer_normal = outer_normal + np.amin(outer_normal) 
    return np.random.dirichlet(shifted_outer_normal) 

# Try 3 values (borders + mean) and sample 1000 times each; calculate means 
print(np.mean([get_sample(0) for i in range(1000)], axis=0)) # input: 0 
print(np.mean([get_sample(2.5) for i in range(1000)], axis=0)) # input: 2.5 
print(np.mean([get_sample(5) for i in range(1000)], axis=0)) # input: 5 

輸出:

[ 0.73142688 0.21514722 0.04402889 0.00939702] # remark: only approximating sum=1 as independent means 
[ 0.21711426 0.27841426 0.28205054 0.22242094] 
[ 0.00943747 0.04039373 0.22860444 0.72156436] 
+0

我會對dirichlet分佈做一些研究,但是很多統計術語超出了我的頭,雖然哈哈。另外麻煩在於將它翻譯成我正在使用的語言Swift – Brejuro