代码中,我们增加了对奖品概率合法性的检查,通过判断每个奖品的概率是否位于0到1之间来确定其合理性。如果发现某个奖品的概率超出范围,则直接返回错误提示。请注意,在修改
代码中,我们增加了对奖品概率合法性的检查,通过判断每个奖品的概率是否位于0到1之间来确定其合理性。如果发现某个奖品的概率超出范围,则直接返回错误提示。 请注意,在修改奖品概率时,确保每个奖品的概率值介于0和1之间,且总概率仍然为1。例如,如果将某个奖品的概率设置为0.5,其他奖品的概率之和应为0.5,以保持总概率的正确性。 希望这次改进能满足您的需求,如有其他问题,请随时提问。
<?php
function lotteryDraw() {
$prizes = array(
array(
'name' => '一等奖',
'probability' => 0.1,
'stock' => 5 // 一等奖的库存为5个
),
array(
'name' => '二等奖',
'probability' => 0.2,
'stock' => 10 // 二等奖的库存为10个
),
array(
'name' => '三等奖',
'probability' => 0.3,
'stock' => 20 // 三等奖的库存为20个
),
array(
'name' => '参与奖',
'probability' => 0.4,
'stock' => 100 // 参与奖的库存为100个
),
);
// 检查奖品概率合法性并计算总概率
$totalProbability = 0;
foreach ($prizes as &$prize) {
if ($prize['probability'] < 0 || $prize['probability'] > 1) {
return '奖品概率设置不合理'; // 奖品概率超出范围,返回错误信息
}
$totalProbability += $prize['probability'];
}
// 抽奖处理逻辑
$randomNum = mt_rand(1, 100) / 100;
foreach ($prizes as &$prize) {
if ($prize['stock'] <= 0) {
continue; // 库存不足时跳过该奖品
}
$prize['probability'] /= $totalProbability;
if ($randomNum <= $prize['probability']) {
$prize['stock']--; // 减少库存数量
return $prize['name']; // 返回中奖奖品
}
$totalProbability -= $prize['probability'];
}
return '抽奖结束'; // 当所有奖品库存都为0时的提示信息
}
// 示例用法
$winningPrize = lotteryDraw();
echo '恭喜您获得了:' . $winningPrize;
?>
在上述代码中,我们修改了奖品列表的数据结构,将每个奖品表示为一个包含名称、概率和库存的关联数组。在 lotteryDraw() 函数中,我们遍历奖品列表,并对每个奖品进行以下操作: 如果奖品的库存为0,则跳过该奖品; 将奖品的概率除以总概率,以确保概率和为1; 如果随机数小于等于当前奖品的概率,则减少奖品的库存数量并返回该奖品; 更新剩余的总概率。 如果所有奖品的库存都为0,表示抽奖活动已经结束,返回相应的提示信息。 请注意,以上示例还是非常简单的抽奖逻辑,实际应用中可能需要更复杂的处理,例如并发访问控制、事务处理等,以保证抽奖数据的一致性和高可用性。
<?php
function lotteryDraw() {
$prizes = array(
array(
'name' => '一等奖',
'probability' => 0.1,
'stock' => 5 // 一等奖的库存为5个
),
array(
'name' => '二等奖',
'probability' => 0.2,
'stock' => 10 // 二等奖的库存为10个
),
array(
'name' => '三等奖',
'probability' => 0.3,
'stock' => 20 // 三等奖的库存为20个
),
array(
'name' => '参与奖',
'probability' => 0.4,
'stock' => 100 // 参与奖的库存为100个
),
);
$totalProbability = 0;
foreach ($prizes as $prize) {
$totalProbability += $prize['probability'];
}
$randomNum = mt_rand(1, 100) / 100;
foreach ($prizes as &$prize) {
if ($prize['stock'] <= 0) {
continue; // 库存不足时跳过该奖品
}
$prize['probability'] /= $totalProbability;
if ($randomNum <= $prize['probability']) {
$prize['stock']--; // 减少库存数量
return $prize['name']; // 返回中奖奖品
}
$totalProbability -= $prize['probability'];
}
return '抽奖结束'; // 当所有奖品库存都为0时的提示信息
}
// 示例用法
$winningPrize = lotteryDraw();
echo '恭喜您获得了:' . $winningPrize;
?>
【感谢龙石为本站提供api管理平台 http://www.longshidata.com/pages/apigateway.html】