抽奖的基本逻辑

复制代码
将数据拼装成如下格式

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表示没有抽到奖品
}
复制代码

 

posted @   王越666  阅读(221)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示