php实现抽奖函数
PHP 抽奖函数实现
以下是一个基于概率权重的 PHP 抽奖函数实现,适用于常见的抽奖场景如奖品抽取、随机选择等。
基础抽奖函数
function lotteryDraw($prizes) {
$totalWeight = array_sum(array_column($prizes, 'probability'));
$rand = mt_rand(1, $totalWeight);
$currentWeight = 0;
foreach ($prizes as $prize) {
$currentWeight += $prize['probability'];
if ($rand <= $currentWeight) {
return $prize;
}
}
}
使用示例:
$prizes = [
['id' => 1, 'name' => '一等奖', 'probability' => 1],
['id' => 2, 'name' => '二等奖', 'probability' => 5],
['id' => 3, 'name' => '三等奖', 'probability' => 10],
['id' => 4, 'name' => '谢谢参与', 'probability' => 84]
];
$result = lotteryDraw($prizes);
echo "恭喜获得:".$result['name'];
改进版抽奖函数(带库存检查)
function advancedLottery($prizes) {
$validPrizes = array_filter($prizes, function($item) {
return $item['stock'] > 0;
});
if (empty($validPrizes)) {
return ['id' => 0, 'name' => '奖品已抽完'];
}
$totalWeight = array_sum(array_column($validPrizes, 'probability'));
$rand = mt_rand(1, $totalWeight);
$currentWeight = 0;
foreach ($validPrizes as $prize) {
$currentWeight += $prize['probability'];
if ($rand <= $currentWeight) {
// 减少库存
$prize['stock']--;
return $prize;
}
}
}
概率分布测试函数
function testProbability($prizes, $times = 10000) {
$results = [];
foreach ($prizes as $prize) {
$results[$prize['id']] = 0;
}
for ($i = 0; $i < $times; $i++) {
$result = lotteryDraw($prizes);
$results[$result['id']]++;
}
foreach ($results as $id => $count) {
$name = $prizes[array_search($id, array_column($prizes, 'id'))]['name'];
echo $name.": ".($count/$times*100)."%\n";
}
}
实际应用建议
- 数据库存储奖品信息时建议包含字段:id, name, probability, stock, description等
- 高并发场景下应使用Redis等缓存系统处理库存
- 重要抽奖活动建议记录中奖日志
- 前端展示可配合动画效果提升用户体验
安全性考虑
- 抽奖概率应在后端计算,不可信任前端提交的数据
- 重要抽奖活动应限制用户参与次数
- 敏感操作需进行权限验证
- 建议对抽奖结果进行加密传输
以上实现可根据实际需求进行调整,核心思想是通过概率权重实现公平随机的抽奖效果。







