当前位置 : 主页 > 网络编程 > PHP >

PHP转盘抽奖简洁写法与运营级写法

来源:互联网 收集:自由互联 发布时间:2023-09-03
代码中,我们增加了对奖品概率合法性的检查,通过判断每个奖品的概率是否位于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】
网友评论