php概率计算_php 抽奖概率算法
/*
* 不同概率的抽獎原理就是把0到*(比重總數)的區間分塊
* 分塊的依據是物品占整個的比重,再根據隨機數種子來產生0-* 中的某個數
* 判斷這個數是落在哪個區間上,區間對應的就是抽到的那個物品。
* 隨機數理論上是概率均等的,那么相應的區間所含數的多少就體現了抽獎物品概率的不同。
*/
function get_rand($proArr)
{
$result = array();
foreach ($proArr as $key => $val) {
$arr[$key] = $val['v'];
}
$proSum = array_sum($arr); // 計算總權重
$randNum = mt_rand(1, $proSum);
$d1 = 0;
$d2 = 0;
for ($i=0; $i < count($arr); $i++)
{
$d2 += $arr[$i];
if($i==0)
{
$d1 = 0;
}
else
{
$d1 += $arr[$i-1];
}
if($randNum >= $d1 && $randNum <= $d2)
{
$result = $proArr[$i];
}
}
unset ($arr);
return $result;
}
/*
* 使用較多的為這個方法
*/
function get_rand1($proArr) {
$result = array();
foreach ($proArr as $key => $val) {
$arr[$key] = $val['v'];
}
// 概率數組的總概率
$proSum = array_sum($arr);
asort($arr);
// 概率數組循環
foreach ($arr as $k => $v) {
$randNum = mt_rand(1, $proSum);
if ($randNum <= $v) {
$result = $proArr[$k];
break;
} else {
$proSum -= $v;
}
}
return $result;
}
/*
* 獎項數組
* 獎品id,名稱,比重
*/
$arr = array(
array('id'=>1,'name'=>'特等獎','v'=>1),
array('id'=>2,'name'=>'一等獎','v'=>5),
array('id'=>3,'name'=>'二等獎','v'=>10),
array('id'=>4,'name'=>'三等獎','v'=>12),
array('id'=>5,'name'=>'四等獎','v'=>22),
array('id'=>6,'name'=>'沒中獎','v'=>50)
);
測試結果(10000次):
get_rand():
count_1:0 count_2:490 count_3:1021 count_4:1172 count_5:2172 count_6:5145
特等獎中獎率全為:0
get_rand1():
count_1:92 count_2:477 count_3:1017 count_4:1195 count_5:2264 count_6:4955
總體感覺 get_rand1() 更準確些......
總結
以上是生活随笔為你收集整理的php概率计算_php 抽奖概率算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: flutter重新配置sdk路径_在An
- 下一篇: 动态规划算法php,php算法学习之动态