我有一个数组,每个值都有权重,用于根据这些权重检索随机值。我过去使用过这样的东西:
$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 ->第二项是