从一个一维数组中按照概率取出对应key

数组类似下面

array(
    0 => 50,
    1 => 60,
    2 => 70,
)

某个子项的value值 除以 (数组value值的总和) 为这个项的概率。求如何按照概率 取出其中“中”的key值

阅读 4.3k
5 个回答
   

 按照你的想法,应该是这样吧,你看是否符合你的要求
<?php
$arr = array(20,30,50);
$res = getRand($arr);
var_dump($res);
function getRand($arr) {
    $result = '';
    //概率数组的总概率精度
    $Sum = array_sum($arr);
    //概率数组循环
    foreach ($arr as $key => $val) {
        $randNum = mt_rand(1, $Sum); //抽取随机数
        if ($randNum <= $val) {
            $result = $key;          //得出结果
            break;
        } else {
            $Sum -= $val;
        }
    }
    unset ($arr);
    return $result;
}
        return $result;
    }
$random = [20,30,50];

function getkey($random) {
    
    $total = 0;
    //劃分權重區間
    foreach($random as $key=>$val) {
        $random[$key] = $val + $total;
        $total += $val;
    }
    //
    $randomnumber = rand(1,$total);
    foreach($random as $key=>$val) {
        if($randomnumber <= $val) {
            $result = $key;
            break;
        }
    }
    return $result;
}

echo getkey($random);

1:首先取得一个概率数字,假设是m
2:50/50+60+70,60/50+60+70,70/50+60+70得到3个权重值,假设为a,b,c,组合后得到三个区间,0-a, a-(a+b),(a+b)-1
3:计算m落在上述3个区间里的哪个区间,然后根据哪个区间就可以得到你要的结果

<?php
$rate = [50,60,70];
$ary = [];
$tmp = 0;
foreach ($rate as $key=>$val)
{

$tmp += $val;
$ary[$key] = $tmp;

}
$rand =rand(1,$tmp);
foreach ($ary as $key=>$val)
{

if ($rand <= $val)
{
    return $key;
}

}

?>

楼主的题意是不是这个意思:
array_sun(array(50,60,70)) //这个值为180;
key1的概率为 50/180 = 0.27777778;
key2概率为 60/180 = 0.33333333333
key3概率为 70/180 = 0.3888888889
输入一个概率 它就给你返回一个key

$array = array(50,60,70);

function getKey($p,$array){

     $sum = array_sum($array); 
     for($i=0;$i<count($array),$i++){  
               if($array[$i]/$sum==$p){
                   return $i;             
               }      
       } 

}

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题