2016-02-05 45 views
2

我有一個數組,每個值用於檢索基於這些權重的隨機值的權重。我過去曾經使用過類似的東西:隨機加權陣列的權重小於1和小數

$items = array("value1" => 30, "value2" => 70); 

$weighted = array(); 

foreach($items as $value => $weight) { 
    $weighted = array_merge($weighted, array_fill(0, $weight, $value)); 
} 

echo $result = $weighted[array_rand($weighted)]; 

但是如果我需要在權重上使用小數? (I總是使用的權重之和爲100順便說一句)

例如:

$items = array("value1" => 0.5, "value2" => 99.5); 

所以值1將僅示出的時間的0.5%。

回答

0

你可以這樣做: 首先,在你想要的精度內創建一個十進制隨機數。 例如,創建一個0到10.000之間的隨機整數併除以100(在這種情況下,它的精度是逗號後的兩位數)。我們將其命名爲random_value。

然後那樣做(在僞代碼):

given: random_value, decimal in [0,100] 
    sum = 0 
    for each item in items 
      sum += weight(item) 
      if(sum >= random_value) 
        return item 
        (and break for-loop) 

所以,如果你得到了權重(0.5,45.5,50)和random_value是46, 我們添加0.5的總和,得到0.5 ,那不是> = 46 - >繼續 我們加上45.5的總和,得到50,即> = 46 - >第二項是

+0

是否需要將權重從低到高排序? – Mark

+0

不,只要順序是清楚的。 – Aziuth