最近实现大转盘功能涉及到抽奖概率的算法问题,整理了一下相关代码,欢迎大家参考哈~~~
思路:
1. 录入中奖产品与中奖概率数据
// 奖项id,奖品,概率 $prize_arr = array( '0' => array('id'=>1,'prize'=>'平板电脑','v'=>2), '1' => array('id'=>2,'prize'=>'数码相机','v'=>5), '2' => array('id'=>3,'prize'=>'音箱设备','v'=>10), '3' => array('id'=>4,'prize'=>'4G优盘','v'=>15), '4' => array('id'=>5,'prize'=>'10Q币','v'=>30), '5' => array('id'=>6,'prize'=>'空奖','v'=>5), );
2. 计算中奖概率
//计算中奖概率 function get_rand($proArr) { $result = ''; //概率数组的总概率精度 $proSum = array_sum($proArr); //概率数组循环 foreach ($proArr as $key => $proCur) { //返回随机整数 $randNum = mt_rand(1, $proSum); if ($randNum <= $proCur) { $result = $key; break; } else { $proSum -= $proCur; } } unset ($proArr); return $result; }
3. 返回中奖信息
function get_prize($list = []){ //拼装奖项数组 $list_ids = array_column($list, 'id'); $list_vs = array_column($list, 'v'); // ID 为键,概率为值 $arr = array_combine($list_ids, $list_vs); //根据概率获取奖项id $rid = get_rand($arr); //中奖项数组 $res['yes'] = $list[$rid-1]; //将中奖项从数组中剔除,剩下未中奖项 unset($list[$rid-1]); // 重置索引 $pr = array_values($list); //未中奖项数组 $res['no'] = $pr; // 返回中奖数据 $result = [ 'msg' => '抽奖成功~', 'code' => 0, 'data' => $res['yes'], ]; return $result; }
函数调用方法:
$result = get_prize($prize_arr); echo "<pre>"; print_r($result);
结果如下:
转载请注明出处~~~~