本文主要向大家介绍了PHP语言:实现微信红包拆分算法,通过具体的内容向大家展示,希望对大家学习php语言有所帮助。

· 修复最后一个红包输出未保留2位数

· 修复领取的红包金额低于最小红包限制

* 红包分配算法

*

* example

*      $coupon = new Coupon(200, 5);

*      $res = $coupon->handle();

*      print_r($res);

*

* @author Flc <2018-04-06 20:09:53>

* @see http://flc.ren | http://flc.io | https://github.com/flc1125

*/class Coupon{

/**

* 红包金额

*

* @var float

*/

protected $amount;

/**

* 红包个数

*

* @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 <= $this->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) <= 60) {

return rand(-70, 70) / 100; // 上下幅度70%

}

return rand(-30, 30) / 100; // 其他情况,上下浮动30%;

}

/**

* 格式化金额,保留2位

*

* @param float $amount

*

* @return float

*/

protected function decimal_number($amount)

{

return sprintf('%01.2f', round($amount, 2));

}}

// 例子$coupon = new Coupon(200, 5, 30);$res = $coupon->handle();print_r($res);

以上就介绍了PHP的相关知识,希望对PHP有兴趣的朋友有所帮助。了解更多内容,请关注职坐标编程语言PHP频道!

php 红包算法,PHP语言:实现微信红包拆分算法相关推荐

  1. 微信红包助手php,php生成微信红包

    php生成微信红包 今天给大家带来微信红包算法的函数!! 用php来生成微信红包~ 直接看代码:/** * 微信红包生成函数 * @param $total 金额 * @param int $num  ...

  2. php 红包算法教程,php仿微信红包分配算法的实现方法

    php仿微信红包分配算法的实现方法 本文实例讲述了php仿微信红包分配算法的实现方法.分享给大家供大家参考,具体如下: /** * 红包分配:把一定金额随机分配给指定人数 * * @param int ...

  3. 红包的分配算法php,php仿微信红包分配算法的实现方法,红包算法

    php仿微信红包分配算法的实现方法,红包算法 本文实例讲述了php仿微信红包分配算法的实现方法.分享给大家供大家参考,具体如下: /** * 红包分配:把一定金额随机分配给指定人数 * * @para ...

  4. 红包的分配算法php,php仿微信红包分配算法的实现方法,红包算法_PHP教程

    php仿微信红包分配算法的实现方法,红包算法 本文实例讲述了php仿微信红包分配算法的实现方法.分享给大家供大家参考,具体如下: /** * 红包分配:把一定金额随机分配给指定人数 * * @para ...

  5. python微信红包代码_Python实现的微信红包提醒功能示例

    本文实例讲述了Python实现的微信红包提醒功能.分享给大家供大家参考,具体如下: #coding=utf-8 import itchat from itchat.content import TEX ...

  6. PHP红包搭建步骤,PHP 生成微信红包代码简单

    这篇文章主要介绍了PHP 生成微信红包代码简单的相关资料,需要的朋友可以参考下 废话不多说了,一切解释尽在代码中,具体代码如下所示: /** * @param $total [你要发的红包总额] * ...

  7. php微信红包雨效果,微信红包雨特效口令大全 微信红包雨特效口令有哪些

    微信红包雨特效口令有哪些?新年牛气冲天,在微信有一场大型的红包雨送给玩家.那么特效口令有哪些呢,下面小编给大家带来微信红包雨特效口令大全,一起来看看吧. 微信红包雨特效口令大全 一.王者荣耀 [排位] ...

  8. 微信红包雨怎么抢_微信红包雨怎么发出? 微信红包雨发送技巧有哪些?

    微信红包雨怎么发出? 微信红包雨发送技巧有哪些?小编最近学会了一项技能,那就是发微信红包雨,一包多发,有对微信红包雨怎么发出感兴趣的伙伴吗,接下来小编与您分享下微信红包雨怎么发出吧. 微信红包雨怎么发 ...

  9. 红包php源码,生成微信红包

    生成微信红包/** * @param $total [你要发的红包总额] * @param int $num [发几个] * @return array[生成红包金额] */ function get ...

  10. java发红包功能_java封装发送微信红包API功能。

    WeChatRedPack java封装发送微信红包API功能. 1.目前支持两种红包类型 普通 裂变 2.目前对微信红包api的发送增加了金额校验,暂时未对发送频率做限制,后期会使用redis进行限 ...

最新文章

  1. Rails测试《一》fixtures简介
  2. 2019金融科技风往哪儿吹?蚂蚁金服联合20余家金融机构预测新年热点:5G、区块链上榜...
  3. 比特币钱包(3) BIP32 HD钱包之密钥树
  4. 云计算具有什么平台_漫话:什么是云计算?
  5. Android中基于Socket的网络通信
  6. 一个符合SEO优化标准的网站应具备哪些特征?
  7. #include 中的stat.h文件到底在哪个目录下面?
  8. PYSQLITE用法初探
  9. html 的scor属性,HTML DOM scrollTop 属性
  10. 2022年下半年软考初级程序员备考
  11. db2 9.5 linux,DB2 8.2 9.1 9.5 9.7 下载地址
  12. 写一份竞品分析文档的思路(模板)
  13. 计算机类毕业论文中期检查,计算机类毕业论文中期检查表
  14. Django发送邮件(附代码)
  15. 字符间距加宽5磅怎么设置_如何设置将word文档的字符间距加宽
  16. SSM+图书馆电子文件资源管理 毕业设计-附源码191614
  17. selenium处理12306登录
  18. 小米玩机------MIUI里那些你可能不知道的冷知识
  19. SAP-MM-移动类型解析之收货02--价值评估冻结库存的收货
  20. Fiddler死活抓不了HTTPS包解决办法(2018更新版本)

热门文章

  1. 电脑w ndows无法自动修复,windows 10自动修复无法修复你的电脑
  2. Android 支付宝登录
  3. WCF RIA优缺点
  4. SQL中及Access的空值
  5. android beta项目官方页面,安卓7.0开发者预览版如何安装?Android Beta项目正式上线...
  6. linux 修改文件访问权限
  7. spring mvc 入门DispatcherServlet转发
  8. python三级联动菜单_VUE+element三级联动或树形菜单获取最后一项,并加入到表格中...
  9. 常用内存分配函数的说明
  10. 【Makefile由浅入深完全学习记录1】认识make和makefile