PHP根据数组中值的权重,按概率获取其中的值

2023.03.10 分享 1490 人浏览 留言
  1. $arr = array(
  2.   "a"=>array("weight"=>90,"v" => 'a'),
  3.   "b"=>array("weight"=>10,"v" => 'b'),
  4.   "c"=>array("weight"=>20,"v" => 'c')
  5. );
  6. function selectValueByProbability($arr){
  7.   $weightsSum = array_sum(array_column($arr, 'weight'));
  8.   $tmpArr = [];
  9.   foreach ($arr as $key => $val) {
  10.     $weight = $val['weight'];
  11.     $float = round($weight/$weightsSum * 100);
  12.     for ($i=0; $i < $float$i++) {
  13.       $tmpArr[] = $key;
  14.     }
  15.   }
  16.   $key = $tmpArr[array_rand($tmpArr)];
  17.   unset($tmpArr);
  18.   return $arr[$key];
  19. }
  20. var_dump(selectValueByProbability($arr));

chatGPT问了一大圈,还是没弄出来,可能是我问的不对吧,最终我整合了下,再换了思路

  1. 先通过array_sum 、array_column获取数组中所有权重的总值
  2. 定义一个临时数组(空值)
  3. 遍历目标数组,并获取值的权重和权重总值的比例乘以100,再四舍五入
  4. 网前面临时数组中循环(3得到的值)插入值的key
  5. 通过array_rand随机获取临时数组中的值
  6. 返回结果

咱不知道有没有更好的方案,虽不是非常精确,但凑合用吧,可以适当调整3中的100这个值,来实现更高的精度

文章地址:https://huilang.me/selectvaluebyprobability/

回复本文

您的电子邮箱地址不会被公开。 必填项已用 * 标注

icon_wink.gif icon_neutral.gif icon_mad.gif icon_twisted.gif icon_smile.gif icon_eek.gif icon_sad.gif icon_rolleyes.gif icon_razz.gif icon_redface.gif icon_surprised.gif icon_mrgreen.gif icon_lol.gif icon_idea.gif icon_biggrin.gif icon_evil.gif icon_cry.gif icon_cool.gif icon_arrow.gif icon_confused.gif icon_question.gif icon_exclaim.gif