资讯专栏INFORMATION COLUMN

PHP红包算法

jerryloveemily / 3049人阅读

摘要:获取随机红包获取最大值和最小值的距离之间的最小值获取到之间的随机数与距离最小值相乘得出浮动区间,这使得浮动区间不会超出范围这个算法的原理其实就是根据剩余不断变化的平均值去加减随机数做到不超过总额,但红包的分布就没那么平均。

产品经理 : 老司机,你那边开发个领取红包的版块。我给一定的金额总数,红包个数,最高发放金额,以及最低发放金额,你要随机生成固定个数的红包,红包总额不能超过金额总数。
老司机 : 你(笔者),去实现这个算法,把生成的红包全部丢到数据库里面。

好吧,就这样,这个需求就让我实现了。其实业务看起来说的很复杂,其实就是例如我有1000元,我想发放100个红包,最高不能超过20块,最低不能低于1块。
当时我也不太清楚这个算法要怎么写,上网搜索了下,找到一种比较合理的算法,是用微积分去实现(我会把代码贴出来)的。算法原理如下


(原文地址:http://blog.csdn.net/cleverco...)
我刚开始觉得这个算法确实很不错,但仔细看了下里面的源码后觉得会比较耗性能,而且回头一看公司的需求,其实也就个红包生成(在项目经理没要求需要正态分布的情况下),没必要把复杂简单的东西弄复杂了。所以我思来想去想了一个晚上,终于写出了个比较合理的算法。

/*
 * 获取随机红包
 * min= money-(n-1)max
 */
function getRedPackage($money, $num, $min, $max)
{
    $data = array();
    if ($min * $num > $money) {
        return array();
    }
    if($max*$num < $money){
        return array();
    }
    while ($num >= 1) {
        $num--;
        $kmix = max($min, $money - $num * $max);
        $kmax = min($max, $money - $num * $min);
        $kAvg = $money / ($num + 1);
        //获取最大值和最小值的距离之间的最小值
        $kDis = min($kAvg - $kmix, $kmax - $kAvg);
        //获取0到1之间的随机数与距离最小值相乘得出浮动区间,这使得浮动区间不会超出范围
        $r = ((float)(rand(1, 10000) / 10000) - 0.5) * $kDis * 2;
        $k = round($kAvg + $r);
        $money -= $k;
        $data[] = $k;
    }
    return $data;
}

这个算法的原理其实就是根据剩余不断变化的平均值去加减随机数做到不超过总额,但红包的分布就没那么平均。


差不多有三个月没写文章了,主要是这三个月一直在学习新的东西,相关php的工具,workman,kafka,以及golang。学的东西很杂,但也做出了效果,每天都在公司躲到11点后才回家。笔者也建议phper新人们,不要单纯限制在php语言里面,以及去讨论php是否是最好的编程语言之类的。毕竟能解决问题的武器就是好武器,一个工程师被公司聘请来就是解决问题的(大声喊出来,我们不是码农)。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/23267.html

相关文章

  • PHP实现微信红包拆分算法

    算法为自创,非微信官方算法(仅供参考);如测出有问题,请及时反馈。感谢 原文:http://flc.ren/2018/04/701.html CHANGELOG 2018-04-07 修复最后一个红包输出未保留2位数 修复领取的红包金额低于最小红包限制

    Drummor 评论0 收藏0
  • PHP扩展 zqf 兼容7.0

    摘要:扩展兼容全局变量适用于高并发抢购秒杀,红包生成,数组算法处理等由于添加了二维码生成功能,安装本扩展之前需要安装,安装方法如下兼容如果没有安装和,也需要安装安装方法如下致力于做工具类,其他的正在开发中第一个参数是红包总额,第二个人 php扩展zqf (兼容php7) 全局变量适用于高并发抢购、秒杀,红包生成,数组算法处理等,由于添加了二维码生成功能,安装本扩展之前需要安装libqrenc...

    jaysun 评论0 收藏0
  • 高并发红包整体设计方案

    摘要:记录下整体的设计思路以及运营过程中的各种问题。如果钱是负数了,还得从已生成的小红包中抽取回来将红包放入队列之中创建红包失败,请检查参数生产和之间的随机数,但是概率不是平均的,从到方向概率逐渐加大。 公司前段时间根据业务方需求需要做一个抢红包的活动,网上也搜索了很多资料。记录下整体的设计思路以及运营过程中的各种问题。 产品需求: 1.红包支持配置开始时间、结束时间、类型(随机金额或固定金...

    shenhualong 评论0 收藏0
  • 高并发红包整体设计方案

    摘要:记录下整体的设计思路以及运营过程中的各种问题。如果钱是负数了,还得从已生成的小红包中抽取回来将红包放入队列之中创建红包失败,请检查参数生产和之间的随机数,但是概率不是平均的,从到方向概率逐渐加大。 公司前段时间根据业务方需求需要做一个抢红包的活动,网上也搜索了很多资料。记录下整体的设计思路以及运营过程中的各种问题。 产品需求: 1.红包支持配置开始时间、结束时间、类型(随机金额或固定金...

    cheukyin 评论0 收藏0
  • 高并发红包整体设计方案

    摘要:记录下整体的设计思路以及运营过程中的各种问题。如果钱是负数了,还得从已生成的小红包中抽取回来将红包放入队列之中创建红包失败,请检查参数生产和之间的随机数,但是概率不是平均的,从到方向概率逐渐加大。 公司前段时间根据业务方需求需要做一个抢红包的活动,网上也搜索了很多资料。记录下整体的设计思路以及运营过程中的各种问题。 产品需求: 1.红包支持配置开始时间、结束时间、类型(随机金额或固定金...

    Freeman 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<