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