概率算法.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;