阅读目录
- 抽奖功能 1
- 抽奖功能 2
抽奖功能 1
最近做的小程序有一个抽奖功能,这里记录下实现抽奖功能的具体流程
前提:
有一组奖品数据如下
id | 奖品(prize) | 概率(rate) | 数量(num) | 已抽数量(prize_num) |
1 | 一等奖 | 10% | 10 | 0 |
2 | 二等奖 | 15% | 20 | 0 |
3 | 三等奖 | 35% | 50 | 0 |
根据如上实现抽奖如下($prizes表示上面表格数据)
public function promise()
{
$prizes = [
[
'id' => 1,
'prize' => '一等奖',
'rate' => '0.1',
'num' => '10',
'prize_num' => '0',
],
[
'id' => 2,
'prize' => '二等奖',
'rate' => '0.15',
'num' => '20',
'prize_num' => '0',
],
[
'id' => 3,
'prize' => '三等奖',
'rate' => '0.3',
'num' => '50',
'prize_num' => '0',
],
];
//进行抽奖
$data = [];
foreach ($prizes as $prize) {
if (($prize['num'] - $prize['prize_num']) > 0) {
$data[$prize['id']] = 100 * ($prize['rate']);
}
};
//获取所有奖品的总概率
$sum = array_sum($data);
$countSum = 100;
if ($sum < $countSum) {
$data[0] = $countSum - $sum;//不满100%,表示没有抽取到奖品
}
$result = 0;
//概率数组总精度
//概率数组循环
foreach ($data as $key => $value) {
$randNum = mt_rand(1, $countSum);
if ($randNum <= $value) {
$result = $key;
break;
} else {
$countSum -= $value;
}
}
unset($arr);
echo $result;//抽到的ID值,0表示没有抽到奖品
}
根据如上就可以实现抽奖功能
抽奖功能 2
<?php
function gl()
{
$prize_arr = [
'0' => ['id' => 1, 'prize' => '奖品1', 'v' => 20],
'1' => ['id' => 2, 'prize' => '奖品2', 'v' => 10],
'2' => ['id' => 3, 'prize' => '奖品3', 'v' => 20],
'3' => ['id' => 4, 'prize' => '奖品4', 'v' => 5],
'4' => ['id' => 5, 'prize' => '奖品5', 'v' => 19],
'5' => ['id' => 6, 'prize' => '奖品6', 'v' => 5],
'6' => ['id' => 7, 'prize' => '奖品7', 'v' => 10],
'7' => ['id' => 8, 'prize' => '奖品8', 'v' => 10],
];
foreach ($prize_arr as $key => $val)
{
$arr[$val['id']] = $val['v'];
}
$rid = get_prize($arr); //根据概率获取奖项id
$data = $prize_arr[$rid - 1];
return $data;
}
function get_prize($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;
}
print_r(gl());