PHP拆红包算法

 /**
     * 拆分红包
     * @param SendRedPackageRequest $request
     * @return array
     */
    protected function spitMoney(SendRedPackageRequest $request)
    {
        $result = [];
        $reamingMoney = $request->money;
        for ($i = $request->count; $i >= 1; $i--) {
            if ($i === 1) {
                $result[] = round($reamingMoney, 2);
                $reamingMoney = 0;
            } else {
                $average = round(bcdiv($reamingMoney, $i), 2);    //平均值
                $amount = round(mt_rand(1, $average * 199) / 100, 2);
                $reamingMoney = doubleval(bcsub($reamingMoney, $amount));
                $result[] = $amount;
            }
        }
        return $result;
    }
逻辑比较简单,传入金额.和拆分的数量
首先循环要拆分的数量
判断如果是最后一个就把剩下的钱全部塞进去
如果不是,就取剩余的金额(第一次循环剩余的金额=总金额)除以剩下的次数,取得平均值,然后再随机取最小的0.01 和平均值*2
把剩余的金额更新一下就行了
算法模拟微信拆红包算法,但是这是提前计算拆分的数据保存的,微信是每次动态计算的
记得设置bcscale(2); 用来设置BC函数默认保留的小数位
本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由系统于 2年前 自动加精
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 8

$amount = round(mt_rand(1, $average * 199) / 100, 2); 请问一下这个199是什么来的

2年前 评论
pslxx (楼主) 2年前

太麻烦了,还影响体验。红包金额,红包人数,红包过期时间。一次性生成好红包每个人的金额,也就是说金额一开始就确定了,至于拿多少和拿的人排第几有关。红包失效根据是否领完,或是否过期来判断

2年前 评论
pslxx (楼主) 2年前
meooo (作者) 2年前
pslxx (楼主) 2年前
pi_phq 2年前

生成的值相加,不会等于总金额?

2年前 评论
firefly丶 2年前
pslxx (楼主) 2年前

发现个小问题:amount取值的时候,已经round。最后result存值的时候,直接赋值就可以

2年前 评论
pslxx (楼主) 2年前

试试 bc math 函数..会有惊喜...

2年前 评论
pslxx (楼主) 2年前

file
@pslxx

1.php


    function spitMoney($money,$count)
    {
        $result = array();
        $reamingMoney = $money;
        for ($i = $count; $i >= 1; $i--) {
            if ($i === 1) {
                $result[] = round($reamingMoney, 2);
                $reamingMoney = 0;
            } else {
                $average = round(bcdiv($reamingMoney, $i), 2);    //平均值
                $amount = round(mt_rand(1, $average * 199) / 100, 2);
                $reamingMoney = doubleval(bcsub($reamingMoney, $amount));
                $result[] = round($amount, 2);
            }
        }
        return $result;
    }

    var_dump(spitMoney(20,2));
2年前 评论
pslxx (楼主) 2年前

目测会造成一个问题,其他人都非常平均,剩余一个人可能非常低,不太符合红包的玩法

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
未填写
文章
1
粉丝
6
喜欢
12
收藏
20
排名:1483
访问:2213
私信
所有博文
社区赞助商