扫码关注官方订阅号
数组类似下面
array( 0 => 50, 1 => 60, 2 => 70, )
某个子项的value值 除以 (数组value值的总和) 为这个项的概率。求如何按照概率 取出其中“中”的key值
走同样的路,发现不同的人生
按照你的想法,应该是这样吧,你看是否符合你的要求 <?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:首先取得一个概率数字,假设是m2:50/50+60+70,60/50+60+70,70/50+60+70得到3个权重值,假设为a,b,c,组合后得到三个区间,0-a, a-(a+b),(a+b)-13:计算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.33333333333key3概率为 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; } }
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
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)
{
}
$rand =rand(1,$tmp);
foreach ($ary as $key=>$val)
{
}
?>
楼主的题意是不是这个意思:
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){
}