php 抽奖算法

    /*
     * 抽奖算法
     * @user AarthiModoo
     * @time 2020-01-09 10:44:09
     * @return array
     * */
    public function randomPrize()
    {
        /*
         * prize 奖项
         * weight 权重
         * */
        $prize = [
            ['id' => 1, 'prize' => '一个月vip', 'weight' => 25],
            ['id' => 2, 'prize' => '两个月vip', 'weight' => 25],
            ['id' => 3, 'prize' => '三个月vip', 'weight' => 25],
            ['id' => 4, 'prize' => '四个月vip', 'weight' => 25]
        ];
        $result = []; // 初始化响应数组
        $weight = []; // 初始化权重数组
        foreach ($prize as $key => $val) {
            $weight[$key] = $val['weight']; // 权重数据放入数组
        }
        // 概率数组的总概率
        $weightSum = array_sum($weight); // 权重总和
        asort($weight); // 排序
        // 权重数组循环
        foreach ($weight as $k => $v) {
            $randNum = mt_rand(1, $weightSum); // 生成一个随机数
            if ($randNum <= $v) {
                $result = $prize[$k]; // 如果随机数小于等于当前权重,结束循环,数据放入响应数据内
                break;
            } else {
                $weightSum -= $v; // 权重总和减去当前权重
            }
        }
        return $result; // 数据返回
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值