按概率分配的问题


题目

有个数组, 每个元素都有一定的权重, 设计一个方法, 只返回一个元素, 该返回元素的概率以其权重计算.

例如: 有数组 $arr=['a'=>4, 'b'=>1, 'c'=>3, 'd'=> 2], 设计一个方法,调用1000万次, a出现约400万次,b出现约100万次,c出现约300万次,d出现约200万次.

解法

使用random生成随机数, 理论上每个数字出现的概率是相等的.

$arr = ['a' => 4, 'b' => 1, 'c' => 3, 'd' => 2];
function get_once($arr) {
    $sum = array_sum($arr);
    $random = mt_rand(1, $sum);
    $tmp = $sum;
    foreach ($arr as $k => $v){
        $tmp -= $v;
        if($random > $tmp){
            return $k;
        }
    }
}

调用10000次,查看测试结果:

$check = [];
for ($i = 0; $i < 10000; $i ++)&#123;
    $res = get_once($arr);
    if(!isset($check[$res]))&#123;
        $check[$res] = 1;
    &#125;else&#123;
        $check[$res] += 1;
    &#125;
&#125;
var_dump($check);

结果输出, 还是比较符合预期的.

array(4) {
  ["c"]=>
  int(2960)
  ["d"]=>
  int(2058)
  ["a"]=>
  int(3997)
  ["b"]=>
  int(985)
}

Author: Itaken
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source Itaken !
  TOC目录