题目
有个数组, 每个元素都有一定的权重, 设计一个方法, 只返回一个元素, 该返回元素的概率以其权重计算.
例如: 有数组 $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 ++){
$res = get_once($arr);
if(!isset($check[$res])){
$check[$res] = 1;
}else{
$check[$res] += 1;
}
}
var_dump($check);
结果输出, 还是比较符合预期的.
array(4) {
["c"]=>
int(2960)
["d"]=>
int(2058)
["a"]=>
int(3997)
["b"]=>
int(985)
}