簡體   English   中英

用於選擇數組中半隨機項的偽隨機算法

[英]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)應該返回一半時間的第二項。

非常感謝任何想法或建議(如何以任何編程語言實現)。 謝謝。

  1. 生成具有權重的部分和的數組P ,即

    P 0 = W 0 ),( P 1 = W 0 + W 1 ),...,( P n = W 0 + W 1 + ... + W n

    (實際上,如果以后不需要權重,則可以在W內執行此操作)。

  2. 產生一個隨機數r [0,P N),其中P n表示最后一個這樣的總和( 全部權重即總和)。

  3. 找到大於您生成的數字的最小 (第一)部分和的索引k

    pk信息 >ř∧∀ 一個 <K:P <R

  4. 使用該索引選擇您的實際元素: 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM