最近实现大转盘功能涉及到抽奖概率的算法问题,整理了一下相关代码,欢迎大家参考哈~~~
思路:
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);
结果如下:

转载请注明出处~~~~
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号