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


Randomize weighted array with weights lower than 1 and decimals

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

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

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

你可以这样说:首先,在所需的精度内创建一个十进制随机数。例如,创建一个介于 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 ->第二项是