PHP 实现微信红包拆分算法

php;gutter:true; handle(); * print_r($res); * * @author Flc * @see http://flc.ren | http://flc.io | https://github.com/flc1125 <em>/ class Coupon { /</em><em> * 红包金额 * * @var float </em>/ protected $amount;</p> <pre><code>/** * 红包个数 * * @var int */ protected $num; /** * 领取的红包最小金额 * * @var float */ protected $coupon_min; /** * 红包分配结果 * * @var array */ protected $items = []; /** * 初始化 * * @param float $amount 红包金额(单位:元)最多保留2位小数 * @param int $num 红包个数 * @param float $coupon_min 每个至少领取的红包金额 */ public function __construct($amount, $num = 1, $coupon_min = 0.01) { $this->amount = $amount; $this->num = $num; $this->coupon_min = $coupon_min; } /** * 处理返回 * * @return array */ public function handle() { // A. 验证 if ($this->amount < $validAmount = $this->coupon_min * $this->num) { throw new Exception('红包总金额必须≥'.$validAmount.'元'); } // B. 分配红包 $this->apportion(); return [ 'items' => $this->items, ]; } /** * 分配红包 */ protected function apportion() { $num = $this->num; // 剩余可分配的红包个数 $amount = $this->amount; //剩余可领取的红包金额 while ($num >= 1) { // 剩余一个的时候,直接取剩余红包 if ($num == 1) { $coupon_amount = $this->decimal_number($amount); } else { $avg_amount = $this->decimal_number($amount / $num); // 剩余的红包的平均金额 $coupon_amount = $this->decimal_number( $this->calcCouponAmount($avg_amount, $amount, $num) ); } $this->items[] = $coupon_amount; // 追加分配 $amount -= $coupon_amount; --$num; } shuffle($this->items); //随机打乱 } /** * 计算分配的红包金额 * * @param float $avg_amount 每次计算的平均金额 * @param float $amount 剩余可领取金额 * @param int $num 剩余可领取的红包个数 * * @return float */ protected function calcCouponAmount($avg_amount, $amount, $num) { // 如果平均金额小于等于最低金额,则直接返回最低金额 if ($avg_amount coupon_min) { return $this->coupon_min; } // 浮动计算 $coupon_amount = $this->decimal_number($avg_amount * (1 + $this->apportionRandRatio())); // 如果低于最低金额或超过可领取的最大金额,则重新获取 if ($coupon_amount < $this->coupon_min || $coupon_amount > $this->calcCouponAmountMax($amount, $num) ) { return $this->calcCouponAmount($avg_amount, $amount, $num); } return $coupon_amount; } /** * 计算分配的红包金额-可领取的最大金额 * * @param float $amount * @param int $num */ protected function calcCouponAmountMax($amount, $num) { return $this->coupon_min + $amount - $num * $this->coupon_min; } /** * 红包金额浮动比例 */ protected function apportionRandRatio() { // 60%机率获取剩余平均值的大幅度红包(可能正数、可能负数) if (rand(1, 100) handle(); </code></pre> <p>print_r($res);

Original: https://www.cnblogs.com/lhm166/p/11423122.html
Author: 智昕
Title: PHP 实现微信红包拆分算法

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/580754/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • SpringBoot官方支持任务调度框架,轻量级用起来也挺香!

    大家好,我是二哥呀。定时任务的应用场景其实蛮常见的,比如说: 数据备份 订单未支付则自动取消 定时爬取数据 定时推送信息 定时发布文章 等等(想不出来了,只能等等来凑,😆,反正只要…

    Java 2023年6月9日
    087
  • Java枚举简单介绍

    枚举 1、枚举简介 枚举,是java中的一种比较特殊的class,它继承了java.lang. Enum类,也就是说在枚举类中是不能够继承其他类的。枚举类型可以取代以往常量的定义方…

    Java 2023年6月13日
    086
  • ElasticSearch(三)SpringBoot 整合ES

    ElasticSearch(三)SpringBoot 整合ES 使用Java API 这种方式,官方已经明确表示在ES 7.0 版本中弃用 TransportClient 客户端,…

    Java 2023年6月5日
    0108
  • DNS服务端搭建

    Docker使用 sameersbn/bind 镜像搭建dns服务器 https://hub.docker.com/r/sameersbn/bind进行下面测试的时候记得将本机的d…

    Java 2023年5月30日
    089
  • 使用python制作动图

    利用python制作gif图 引言 当写文章时候,多张图片会影响排版,可以考虑制作gif图 准备 pip install imageio 代码 This is a sample P…

    Java 2023年6月8日
    0130
  • dubbo源码分析8(服务消费者之生成代理对象)

    前面几篇博客,说了很多dubbo服务提供者相关的流程; 复习一下:首先服务提供者去暴露服务接口数据到注册中心,然后本地启动netty服务端监听是否有消费者的请求,现在我们可以看看消…

    Java 2023年6月6日
    084
  • Springboot整合二 集成 rabbitmq

    1、在application.yml文件中进行RabbitMQ的相关配置先上代码 spring: rabbitmq: host: 192168.21.11 port: 5672 u…

    Java 2023年5月30日
    079
  • windows系统命令行cmd查看显卡驱动版本号CUDA

    好看请赞,养成习惯:) 本文来自博客园,作者:靠谱杨, 转载请注明原文链接:https://www.cnblogs.com/rainbow-1/p/16656547.html 关于…

    Java 2023年6月15日
    082
  • C#、Java和JS实现SHA256+BASE64加密总结

    C#、Java和JS实现SHA256+BASE64加密总结 https://www.cnblogs.com/muphy/p/10781449.html posted on2021-…

    Java 2023年5月29日
    0104
  • 基于spring security创建基本项目框架

    SpringBoot建项目步骤 建表 新建项目 (package name可以自定义,整个项目只能在该包下) 选择可能有到的依赖 (别忘了勾选SQL中的Mybatis Framew…

    Java 2023年6月14日
    075
  • ArrayList源码分析

    ArrayList源码分析 默认大小 // 根据传入的初始化大小创建对应的数组大小 public ArrayList(int initialCapacity) { if (init…

    Java 2023年6月16日
    074
  • nginx出现 “414 request-uri too large”

    在请求查询的时候使用了Get方法,由于拼接的url过长,导致nginx出现了”414 request-uri too large”错误。 出现这种问题可以按…

    Java 2023年5月30日
    062
  • 使用 VMware Workstation Pro 安装新的虚拟机

    一、连接服务器 (1)”文件”右键 (2)输入用户名、密码连接服务器 二、创建新的虚拟机 (1) (2) (3) (4) (5) (6) (7) (8) 三…

    Java 2023年5月30日
    070
  • 同时在多个 Git 分支上工作,老板要榨干我

    背景 上一篇文章 保持清洁的Git提交记录,三招就够了 ,大家看过后有私下留言说这是非常好用的功能,我突然想到工作中用到的另外一个 Git 功能那也是相当好用,必须全盘托出 作为程…

    Java 2023年6月5日
    079
  • CSS

    一、入门基础 1.1、语法 ​ 选择器{ ​ 声明1; ​ 声明2; ​ } Title h1{ width: 180px; color: aqua; } 我是标题 建议这种规范 …

    Java 2023年6月8日
    068
  • 和身边的人搭伴学

    互为磨刀石 互相挑毛病。前提是双方都非常信任彼此,因为搞软件大多容易沉浸在自己的问题里,又不太善于做高情商的表达。一遇到沟通问题,一句话说不好就会引发误会。 有了信任的伙伴,你就不…

    Java 2023年6月15日
    093
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球