返回文章列表

PHP 实现支持权重的 array_rand 方法

2025年3月25日
PHP

PHP 字段的 array_rand 方法是从 array 中随机挑选一个并返回元素的 key。但是有时候 array 中的元素是有权重的,权重越大概率被随机到的概率也就越大。像 Python 就提供了一个 random.choices 的方法。网上搜到一个带权重的随机数生成,正好可以使用 PHP 来实现带权重的 array_find,这里只实现一个基础版本,另外的想要随机多个元素的可以自己支持。

文章中重要的只有三点:

  1. 累加元素中的权重值,并从 1 到累加值中随机一个数字
  2. 遍历数组重点每个元素,使用第一步随机到的数字减去当前遍历元素的权重值
  3. 当值随机的值小于等于 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;
        }
    }
}