千家信息网

PHP红包算法的思路分享

发表于:2025-11-10 作者:千家信息网编辑
千家信息网最后更新 2025年11月10日,本篇内容介绍了"PHP红包算法的思路分享"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!PHP红包算法
千家信息网最后更新 2025年11月10日PHP红包算法的思路分享

本篇内容介绍了"PHP红包算法的思路分享"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

根据很多需求的使用场景,如发红包、砍价类需求,这两个功能都有一个同样的特点,如下:

红包

1.总金额
2.红包个数
3.最小红包数量

砍价

1.砍价总金额
2.需要多少人完成砍价(人数根据需求而定)

  • 固定砍价人数

  • 随机砍价人数

  • 指定随机砍价人数
    第2点三个规则都需要根据规则得出一个人数

3.最小砍价金额

开发思路

验证参数

最小金额不允许小于0
总金额不允许大于数量乘最小金额

分配金额

取得平均金额(总金额/剩余数量)

分配金额 平均金额小于等于最金额时直接分配最小金额
获取金额幅度比例 最小值不允许小于 -1 最大值不允许大于 1
得出分配金额 幅度计算(平均值*(1+幅度比例))
分配金额判断 分配金额小于最小金额或者分配金额大于 可领取最大金额 ((最小金额+剩余总金额)- (剩余数量×最小金额))时 重新分配金额
剩余最后一个则剩余所有金额都分配

开发代码

amount = $amount;        $this->num = $num;        $this->minAmount = $minAmount;    }    /**     * 处理返回     * @return array     * @throws Exception     */    public function handle()    {        # 验证        if ($this->amount < $validAmount = $this->minAmount * $this->num) {            throw new Exception('红包总金额必须≥'.$validAmount.'元');        }        # 分配红包        $this->allot();        return $this->amountArr;    }    /**     * 分配红包     */    protected function allot()    {        # 剩余可分配的红包个数        $num = $this->num;        # 剩余可领取的红包金额        $amount = $this->amount;        while ($num >= 1) {            if ($num == 1) {                # 剩余一个的时候,直接取剩余红包                $coupon_amount = $this->formattingAmount($amount);            } else {                # 平均金额                $avgAmount = $this->formattingAmount($amount / $num);                # 分配金额                $countAllotAmount = $this->countAllotAmount($avgAmount, $amount, $num);                # 剩余的红包的平均金额                $coupon_amount = $this->formattingAmount($countAllotAmount);            }            # 追加分配金额            $this->amountArr[] = $coupon_amount;            # 计算剩余金额            $amount -= $coupon_amount;            $num--;        }        # 随机打乱        // shuffle($this->amountArr);    }    /**     * 计算分配的红包金额     * @param float $avgAmount 每次计算的平均金额     * @param float $amount 剩余可领取金额     * @param int $num 剩余可领取的红包个数     * @return float     */    protected function countAllotAmount($avgAmount, $amount, $num)    {        # 如果平均金额小于等于最低金额,则直接返回最低金额        if ($avgAmount <= $this->minAmount) {            return $this->minAmount;        }        # 浮动比率        $floatingRate = $this->floatingRate();        # 分配金额        $allotAmount = $avgAmount * (1 + $floatingRate);        # 浮动计算        $coupon_amount = $this->formattingAmount($allotAmount);        # 如果低于最低金额或超过可领取的最大金额,则重新获取        if ($coupon_amount < $this->minAmount || $coupon_amount > $this->canReceiveMaxAmount($amount, $num)) {            return $this->countAllotAmount($avgAmount, $amount, $num);        }        return $coupon_amount;    }    /**     * 计算分配的红包金额-可领取的最大金额     * @param $amount     * @param $num     * @return float|int     */    protected function canReceiveMaxAmount($amount, $num)    {        return $this->minAmount + $amount - $num * $this->minAmount;    }    /**     * 红包金额浮动比例     * @return float|int     */    protected function floatingRate()    {        # 60%机率获取剩余平均值的大幅度红包(可能正数、可能负数)        if (rand(1, 100) <= 60) {            # 上下幅度70%            return rand(-70, 70) / 100;        }        # 其他情况,上下浮动30%;        return rand(-30, 30) / 100;    }    /**     * 格式化金额,保留2位     * @param $amount     * @return string     */    protected function formattingAmount($amount)    {        return sprintf('.2f', round($amount, 2));    }}
  • 总金额

$amount = 1;
  • 分配数量

$num = 10;
  • 最小金额

$minAmount = 0.01;$red = new sandRed($amount, $num, $minAmount);$res = $red->handle();print_r($res);
  • 输出结果 [0.10,0.04,0.08,0.04,0.16,0.14,0.11,0.13,0.11,0.09]

echo array_sum($res);
  • 输出结果 1

"PHP红包算法的思路分享"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

金额 红包 分配 剩余 最小 人数 数量 最大 幅度 浮动 思路 算法 最低 个数 比例 需求 输出 上下 内容 平均值 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 找不到蓝牙服务器 软件开发项目管理程序 豪迈集团软件开发工程师岗位 深度分析网络安全防御 网络安全 18年 号文 战地1服务器已断线 加强网络安全监测值守工作 网络技术女生非技术类职业 oracle数据库中存储大小 ipran专网网络安全方案 荣昌区网络安全审计系统咨询证书 数词笔记软件开发 进入数据库显示502 山东网络安全周是真的吗 网络安全顾问职工是做什么的 涉疫敏感网络安全 上海质量网络技术造型设计 老年人搜索软件开发 代理服务器属于中间人攻击吗 国家经济研究院数据库官网 河南云程网络技术有限公司 ps5proxy服务器是什么 mac系统的软件开发语言 换电池后显示无法验证服务器信息 软件开发的下属部门有哪些 万方智搜的合作数据库 打印服务器如何设置 泰安数字化城管软件开发公司 网络安全实施计划工作方案 找出2个表格相同数据库
0