[英]Pseudo-random algorithm for selecting semi-random item in an array
我有一個簡單的整數數組(或根據需要設置),將其稱為X。我還有另一個數組W,用於存儲數組X中元素的“權重”。“ weight”指示第n個元素應該有多大的可能性被選中。 現在,我需要一種方法(算法)(偽)根據數組W中定義的“權重”從數組/集合X中隨機選擇一個元素。
例如,如果我的W看起來像這樣:W [0] = 2; W [1] = 4; W [2] = 6;
這意味着從數組X中選擇第N個項目的概率為:X [0] = 16.6%X [1] = 33.3%X [2] = 50%
因此方法get_pseudorandom_item(X)應該返回一半時間的第二項。
非常感謝任何想法或建議(如何以任何編程語言實現)。 謝謝。
生成具有權重的部分和的數組P ,即
( P 0 = W 0 ),( P 1 = W 0 + W 1 ),...,( P n = W 0 + W 1 + ... + W n )
(實際上,如果以后不需要權重,則可以在W內執行此操作)。
產生一個隨機數r [0,P N),其中P n表示最后一個這樣的總和( 全部權重即總和)。
找到大於您生成的數字的最小 (第一)部分和的索引k :
pk信息 >ř∧∀ 一個 <K:P 一 <R
使用該索引選擇您的實際元素: X k
假設X[]
中的數字相加為1.0。 因此X[2]
為0.5000
。
您選擇您的號碼並添加,直到您用完為止。
這是一個Java示例:
double rand = random.nextDouble();
double sofar = 0.0;
for(int i = 0; i < X.length; x++) {
if(sofar + X[i] > rand) return W[i];
sofar += X[i];
}
throw new IllegalStateException("Numbers add up to less than 1");
對於每個對象類型x [i]其中y是權重。 在x [i]類型的數組中添加y個元素。
然后從該數組中隨機選擇。
以您的示例為例,您在集合中將有2 W [0],4 W [1]和6 W [2],您可以從中隨機選擇一個類型為0、1或2的項目。
對我而言,第一件事不是一個非常漂亮的解決方案,但是我還是會分享它!
您可以創建另一個數組(例如100個整數)。 每個整數將表示W中的索引。 根據給定的百分比,您可以用整數填充該數組。
因此,如果您有X [0] = 25%X [1] = 25%X [2] = 50%數組將具有25 1's,25 2's和50 3's
然后,您可以選擇該數組的偽隨機索引,然后使用返回的索引來檢索W中的對象。
就像我說的那樣,這很丑陋,但是可以用:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.