随机化加权数组,权重小于1和小数

时间:2016-02-05 17:36:10

标签: php arrays math random

我有一个数组,每个值都有权重,用于根据这些权重检索随机值。我过去曾经使用过这样的东西:

$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)];

但是如果我需要在权重上使用小数呢? (我使用的重量总是达到100 btw)

例如:

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

因此,value1只会显示0.5%的次数。

1 个答案:

答案 0 :(得分: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 - >第二项是