PHP根据数组中值的权重,按概率获取其中的值
- $arr = array(
- "a"=>array("weight"=>90,"v" => 'a'),
- "b"=>array("weight"=>10,"v" => 'b'),
- "c"=>array("weight"=>20,"v" => 'c')
- );
- function selectValueByProbability($arr){
- $weightsSum = array_sum(array_column($arr, 'weight'));
- $tmpArr = [];
- foreach ($arr as $key => $val) {
- $weight = $val['weight'];
- $float = round($weight/$weightsSum * 100);
- for ($i=0; $i < $float; $i++) {
- $tmpArr[] = $key;
- }
- }
- $key = $tmpArr[array_rand($tmpArr)];
- unset($tmpArr);
- return $arr[$key];
- }
- var_dump(selectValueByProbability($arr));
chatGPT问了一大圈,还是没弄出来,可能是我问的不对吧,最终我整合了下,再换了思路
- 先通过array_sum 、array_column获取数组中所有权重的总值
- 定义一个临时数组(空值)
- 遍历目标数组,并获取值的权重和权重总值的比例乘以100,再四舍五入
- 网前面临时数组中循环(3得到的值)插入值的key
- 通过array_rand随机获取临时数组中的值
- 返回结果
咱不知道有没有更好的方案,虽不是非常精确,但凑合用吧,可以适当调整3中的100这个值,来实现更高的精度