拆红包算法 php

 本篇文章给大家简析PHP拆红包算法,有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。逻辑比较简单,传入金额.和拆分的数量。拿到这分配的金钱,使用redis队列方式存放起来,当客户点击领取的时候,出队列。这样不会多抢。redis的部分下面我就没针对描述了。

PHP拆红包算法

代码如下:

/**
     * @param $total 总价钱
     * @param $num   总分发的人数
     * @param float $min 最新分多少 默认0.01
     * @return array
     */
    public function getRedPackage($total,$num,$min=0.01){
        $old_total = $total;
        $data=array();
        if($min*$num>$total){
            return [
                'code' => 1,
                'msg' => '最少数 * 人数不能大于总额'
            ];
        }
        for ($i=1;$i<=$num;$i++){
            $money = 0;
            if ($num - $i > 0) {//最后一个 除数为0 ,根据运行除数不能为0 只能 计算到 N - 1,需要再最后补上一个数
                $safe_total = ($total - ($num - $i) * $min) / ($num - $i); # 随机安全上限 剩余的钱/此时的人数 = 此时的平均数 作为最大的数
                $money = $this->money_val(intval($min * 100), intval($safe_total * 100)) / 100;
                $total -= $money;
                $data[] = "$money";//转字符串
            }

        }
        array_push($data,sprintf("%.2f",$old_total - array_sum($data)));//把最后一个值放在数据中
        return $data;
    }
    private function money_val($min,$max){
        if ($min > $max){
            $min = $min;
        }else{
            $min = rand($min,$max);
        }
        return $min;
    }

猜你喜欢

转载自blog.csdn.net/qq_34861341/article/details/127719824
今日推荐