数组类似下面
array(
0 => 50,
1 => 60,
2 => 70,
)
某个子项的value值 除以 (数组value值的总和) 为这个项的概率。求如何按照概率 取出其中“中”的key值
数组类似下面
array(
0 => 50,
1 => 60,
2 => 70,
)
某个子项的value值 除以 (数组value值的总和) 为这个项的概率。求如何按照概率 取出其中“中”的key值
$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;
}
}
}
10 回答11.1k 阅读
15 回答8.4k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
8 回答6.2k 阅读
2 回答2.6k 阅读✓ 已解决