PHP 字段的 array_rand 方法是从 array 中随机挑选一个并返回元素的 key。但是有时候 array 中的元素是有权重的,权重越大概率被随机到的概率也就越大。像 Python 就提供了一个 random.choices 的方法。网上搜到一个带权重的随机数生成,正好可以使用 PHP 来实现带权重的 array_find
,这里只实现一个基础版本,另外的想要随机多个元素的可以自己支持。
文章中重要的只有三点:
- 累加元素中的权重值,并从 1 到累加值中随机一个数字
- 遍历数组重点每个元素,使用第一步随机到的数字减去当前遍历元素的权重值
- 当值随机的值小于等于 0 时,就是随机元素的 key
function weighted_array_rand(array $weighted_array)
{
$total = array_sum($weighted_array);
$rand = mt_rand(1, $total);
foreach ($weighted_array as $key => $val) {
$rand -= $val;
if ($rand <= 0) {
return $key;
}
}
}