2017-09-05 11 views
0

が、私は4つの通貨を持っていると私は、ランダムに1つを選択したいとしましょう生成:いくつかの「評価」の値に基づいていくつかの外部の値に基づいて配布

Bronze, Silver, Gold, Platinum 

、私はそれぞれの通貨に確率を割り当てますそのチャンスを選ぶことができます。この評価値が0.0〜5.0であるとします。

評価が高い場合はプラチナ側に、私の評価が低い場合はブロンズ側に重みを付けたいと思います。

だから、5.0の評価は次のようになります。

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

、同様に0.0の評価は次のようになります。2.5の評価は、より均等に真ん中の通貨の間で広がって見えるかもしれません

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

私は本当にこれを処理するアルゴリズムを考えることはできません。どのようにして、配布を制御する何らかの値に基づいて100%の配布を生成できますか?誰でも私がどこから始められるか知っていますか?

+0

「評価は5.0のように見える」この評価はどの通貨でですか?白金? – axiom

+0

@axiom私はちょうど評価5.0の "加重"分布の例を挙げていました。プラチナのピッキング確率が高いのはどうですか?レーティングはどの通貨ともペアになっていません。 – Brejuro

答えて

1

あなたが持っているデータに4直線を合わせて1日と呼ぶのが簡単な答えです。

より柔軟なアプローチは、あなたが好きなように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=2に金がある可能性が最も高いです。そして、r=5にプラチナがある可能性が高いです。

さまざまな機能を試して、ゲームの中で最も再生可能な結果が得られるようにする必要があります。

+0

このソリューションにはありがとうございます!これはいくつかの複雑な統計関数を実装するよりもはるかに簡単です私はまた、私は重み付けで遊ぶために数字を微調整することが好きです – Brejuro

0

ここに私は多分統計家から(少なくとも実行のために)罰を受けるに値するアイデア/スケッチがあります。私はこれが大規模な適合問題ではないと仮定しています。これは他のアプローチを必要とするかもしれません。

一般的な考えは、dirichlet-distributionを使用して最終配布を生成することです。ディリクレ分布自体にもパラメータ(wiki参照)があり、ここでは対称性と2つのパラメータしか必要としないので正規分布を使用します(ここでは分散を修正することができます。このスカラー - > dist関数のマッピングを制御するための設計パラメータであり、実際には非凸型のように自明ではないいくつかの1次元最適化問題でも最適化変数として使用することができ、評価関数)を、ディリクレ分布を定義するための内部分布として定義する。ここで

はおそらく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

私はディリクレ分布についてのいくつかの研究を行うでしょう、統計用語の多くは、 。また、問題は私が使用している言語Swiftにこれを翻訳することです – Brejuro

関連する問題