2011-06-07 52 views
0

我已經閱讀了很多關於此主題的文章,但我對所發現的內容並不滿意。選擇具有雙重偏差的隨機項目

我有一個對象列表,我們稱它們爲「L」。 「

」L「有兩個屬性,」L.small「和」L.big「。

我想選擇一個隨機的「L」,但偏向選擇,以便我更可能選擇具有較低「L.small」和較高「L.big」的對象。因此,爲了清楚起見,它是低「L.small」和高「L.big」的組合,使物體更具吸引力。

下面是一個例子:

比方說最大可能L.small爲50,最大L.big是1000,000。所以L.small是一個隨機的小數值範圍,L.big是一個隨機的大數值範圍。

L1.small = 1 //最佳可能的。小

L1.big = 1000,000 //最佳可能的。大

L2.small = 50 //最不理想的。小

L2.big = 1 //最不理想的。大

L3.small = 25 //相當平均

L3.big = 500000 //相當平均

在這個例子中,L1最有可能被選中,而L2最不可能,而L3則介於兩者之間。

也只是爲了給更多的背景,我真正的價值觀是長期的。

+0

你說過關於「更可能」和「更不可能」 - 但是*這些可能是怎麼樣的?基本上你需要提供某種權重函數來賦予每個項目一個非負的權重,在這一點上我的答案的其餘部分適用。我們無法真正猜出權重函數......例如它可能是「大 - 小+ 100」,這可以用於您的示例數據,但這可能不是您真正想要的權重。 – 2011-06-07 10:44:03

回答

2

編輯:好吧,我誤解了這個問題。你使用的確切算法取決於你想要的東西如何偏向。例如,你可以有效地只把每個對象爲具有的big - small「重量」 ......然後加起來列表中的所有項目的權重:

int totalWeight = 0; 
for (Foo foo : list) 
{ 
    totalWeight += foo.getWeight(); 
} 

// As usual, normally you'd reuse an existing instance 
Random rng = new Random(); 
int value = rng.nextInt(totalWeight); 

// Pick an item based on the random value we've chosen 
for (Foo foo : list) 
{ 
    if (value < foo.getWeight()) 
    { 
     return foo; 
    } 
    value -= foo.getWeight(); 
} 
+0

謝謝喬恩。道歉我的問題一定不能明確定義。首先我想要整個對象,而不是foo.small或foo.big,我想要Foo。此外,我希望將* properties,.small和.big一起考慮,以便具有非常小的foo.small和非常大的foo.big的對象更有可能被選擇爲具有說出avergare foo.small和foo.big。 – zuki 2011-06-07 10:26:34

+0

@zuki:好的,我明白了......但請舉個具體的例子,包括你希望這個貢獻有多大的偏見。 – 2011-06-07 10:30:21

+0

@zuki:你應該用示例編輯你的*問題*,而不是將它置於註釋中。請參閱我的編輯以獲取示例方法。 – 2011-06-07 10:34:10

0

如果我理解正確的話,你想使用非均勻概率密度函數(PDF)生成隨機變量?如果是這樣,您可能會對inverse transform sampling感興趣,它允許您將均勻分佈的隨機數(例如您可能從java.util.Random獲得)轉換爲具有任意PDF的隨機數。

+0

感謝您的鏈接,它會花費我一些時間來消費內容:-)我認爲這對我的目的來說是過度殺傷力的......我的數據也可能實時傳輸,因此它必須非常高效。 – zuki 2011-06-07 10:49:22