概率算法.php '0.1000000000','id'=1], ['probability'='0.3000000000','id'=2], ['probability'='0.6000000000','id'=3],];$d=10; // 小数点精度$count = 10**$d; // 总球数/** * 原理说明: * 精度为10,总球数为10**10,概率**10得
'0.1000000000','id'=>1],
['probability'=>'0.3000000000','id'=>2],
['probability'=>'0.6000000000','id'=>3],
];
$d=10; // 小数点精度
$count = 10**$d; // 总球数
/**
* 原理说明:
* 精度为10,总球数为10**10,概率**10得出每个概率对应的球数:
* 1000000000,3000000000,6000000000
* 从总球数中取一个随机数
* 如果数值落在区间 1~1000000000 则中1
* 如果数值落在区间 1000000000~(1000000000+3000000000) 则中2
* 如果数值落在区间 4000000000~(4000000000+6000000000) 则中3
*/
$probs = []; // prize_id=>概率
$win_prize_id =0;
foreach ($prizes as $k => $v) {
if($v['probability']-0){ // 如果设置了概率
if($v['probability']>=1){
$win_prize_id =$v['id'];
break;
}
$probs[$v['id']] = ($v['probability']*$count); // 概率对应的球数
}
}
if($win_prize_id==0){
$rand=mt_rand(1,$count); // 随机取出一个球
asort($probs); // 按概率排序,并保留prize_id
$sep = 0;
foreach ($probs as $prize_id=>$prob ) {
if($rand<=$prob+$sep){ // 如果小球在第一个奖品的数值范围内就中奖
$win_prize_id = $prize_id;
break;
}
$sep+=$prob;
}
}
echo $win_prize_id;
