抽奖的基本逻辑

将数据拼装成如下格式

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 @ 2021-12-14 09:13  王越666  阅读(200)  评论(0编辑  收藏  举报