2010-09-14 68 views
1

所以,我坐在我的後院考慮口袋妖怪,因爲我們都習慣這樣做,這讓我想:當你遇到一個隨機的口袋妖怪時,有些樣本比其他樣本更經常出現,這意味着它們的權重不同於出現較少的樣本。從任意大樣本中隨機選擇時加權不同結果

現在,我是否需要以一定的概率出現讓不同的口袋妖怪出現的問題,我很可能會這樣做,只需增加某些口袋妖怪在選擇池中的入口數量(如此) ,

Pool: 
C1 C1 C1 C1 
C2 C2 
C3 C3 C3 C3 C3 
C4 

所以C1有三分之一的機會被拉到,C2具有1/6的機會,等等,但我明白,這可能是一個非常簡單而幼稚的做法,是不可能很好地擴展有大量的選擇。

所以,我的問題是這樣的,S/O:給定一個任意大的樣本量,你如何去衡量一個結果大於另一個結果的機會?而且,作爲後續問題,假設您希望某些選項的概率以浮點精度與整數比率相對的比率出現?

+0

寵物小精靈+1。 – 2010-09-14 16:46:08

+0

查看http://stackoverflow.com/questions/3655430/selection-based-on-percentage-weighting – 2010-09-14 19:17:12

回答

1

如果你知道每個事件的發生,你需要這些概率的範圍0-100映射的可能性(如果你想用實數和概率或0〜1)

所以在上面的例子中有12個Cs。 C1爲4/12或〜33%,C2爲〜12%的2/12,C3爲5/12或〜42%,C4爲1/12或〜8%。

請注意,這些全部加起來爲100%。所以如果我們選擇一個0到100之間的隨機數,我們可以將C1映射到0-33,C2映射到33-50(比C1的值大17),C3映射到50-92,C4映射到92-100。

if語句可以做出選擇:

r = rand() # between 0-100 
if (r <33) 
    return "C1" 
elsif (r < 50) 
    return "C2" 
elsif (r < 92) 
    return "C3" 
elsif (r < 100) 
    return "C4" 

如果你想要更多的精度高於1 100剛剛從1-1000或任何範圍內你想要去。這可能是更好的形式來使用整數和擴展它們而不是使用浮點數,因爲如果值之間的擴展變大,浮點可能會有奇怪的行爲。

如果你想要像你展示你上面可以嘗試像這樣(在紅寶石雖然想法是更普遍的)走合併路線:

a = ["C1"]*4 + ["C2"]*2 + ["C3"]*5 + ["C4"] 
# ["C1", "C1", "C1", "C1", "C2", "C2", 
# "C3", "C3", "C3", "C3", "C3", "C4"] 
a[rand(a.length)] # => "C1' w/ probability 4/12 

,你需要創建分級會更慢數組,但更容易添加替代方法,因爲您不需要每次重新計算概率。

您還可以從數組表示中生成上述代碼,以便在代碼生成時只進行一次預處理命中,然後從創建的代碼中獲得快速答案。

+0

我想到了這種方法,但在我看來,它會遭受與我的其他方法相同的縮放問題。假設一個樣本量爲50,000個對象,每個對象都有唯一的非離散概率;隨機數的範圍有多大? – Andy 2010-09-14 17:01:19

+0

您將不得不爲每個對象分配一個概率,除非在對象之間存在某種基礎連接,您也可以在選擇代碼中利用這些連接,否則無法解決該問題。如果您想要將這些項目分類,您也可以將其作爲選擇,我編輯了這個問題。但是,50k看起來並不多,這取決於你的概率的精確度。 – 2010-09-14 18:54:30

+0

該方法在浮點上的工作方式與在整數上一樣容易。隨機數的範圍需要是單個項目概率的總和。請參閱http://stackoverflow.com/questions/3655430/selection-based-on-percentage-weighting/3655542#3655542 – 2010-09-14 19:16:04