php 红包算法,PHP语言:实现微信红包拆分算法
本文主要向大家介绍了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语言:实现微信红包拆分算法相关推荐
- 微信红包助手php,php生成微信红包
php生成微信红包 今天给大家带来微信红包算法的函数!! 用php来生成微信红包~ 直接看代码:/** * 微信红包生成函数 * @param $total 金额 * @param int $num ...
- php 红包算法教程,php仿微信红包分配算法的实现方法
php仿微信红包分配算法的实现方法 本文实例讲述了php仿微信红包分配算法的实现方法.分享给大家供大家参考,具体如下: /** * 红包分配:把一定金额随机分配给指定人数 * * @param int ...
- 红包的分配算法php,php仿微信红包分配算法的实现方法,红包算法
php仿微信红包分配算法的实现方法,红包算法 本文实例讲述了php仿微信红包分配算法的实现方法.分享给大家供大家参考,具体如下: /** * 红包分配:把一定金额随机分配给指定人数 * * @para ...
- 红包的分配算法php,php仿微信红包分配算法的实现方法,红包算法_PHP教程
php仿微信红包分配算法的实现方法,红包算法 本文实例讲述了php仿微信红包分配算法的实现方法.分享给大家供大家参考,具体如下: /** * 红包分配:把一定金额随机分配给指定人数 * * @para ...
- python微信红包代码_Python实现的微信红包提醒功能示例
本文实例讲述了Python实现的微信红包提醒功能.分享给大家供大家参考,具体如下: #coding=utf-8 import itchat from itchat.content import TEX ...
- PHP红包搭建步骤,PHP 生成微信红包代码简单
这篇文章主要介绍了PHP 生成微信红包代码简单的相关资料,需要的朋友可以参考下 废话不多说了,一切解释尽在代码中,具体代码如下所示: /** * @param $total [你要发的红包总额] * ...
- php微信红包雨效果,微信红包雨特效口令大全 微信红包雨特效口令有哪些
微信红包雨特效口令有哪些?新年牛气冲天,在微信有一场大型的红包雨送给玩家.那么特效口令有哪些呢,下面小编给大家带来微信红包雨特效口令大全,一起来看看吧. 微信红包雨特效口令大全 一.王者荣耀 [排位] ...
- 微信红包雨怎么抢_微信红包雨怎么发出? 微信红包雨发送技巧有哪些?
微信红包雨怎么发出? 微信红包雨发送技巧有哪些?小编最近学会了一项技能,那就是发微信红包雨,一包多发,有对微信红包雨怎么发出感兴趣的伙伴吗,接下来小编与您分享下微信红包雨怎么发出吧. 微信红包雨怎么发 ...
- 红包php源码,生成微信红包
生成微信红包/** * @param $total [你要发的红包总额] * @param int $num [发几个] * @return array[生成红包金额] */ function get ...
- java发红包功能_java封装发送微信红包API功能。
WeChatRedPack java封装发送微信红包API功能. 1.目前支持两种红包类型 普通 裂变 2.目前对微信红包api的发送增加了金额校验,暂时未对发送频率做限制,后期会使用redis进行限 ...
最新文章
- Rails测试《一》fixtures简介
- 2019金融科技风往哪儿吹?蚂蚁金服联合20余家金融机构预测新年热点:5G、区块链上榜...
- 比特币钱包(3) BIP32 HD钱包之密钥树
- 云计算具有什么平台_漫话:什么是云计算?
- Android中基于Socket的网络通信
- 一个符合SEO优化标准的网站应具备哪些特征?
- #include 中的stat.h文件到底在哪个目录下面?
- PYSQLITE用法初探
- html 的scor属性,HTML DOM scrollTop 属性
- 2022年下半年软考初级程序员备考
- db2 9.5 linux,DB2 8.2 9.1 9.5 9.7 下载地址
- 写一份竞品分析文档的思路(模板)
- 计算机类毕业论文中期检查,计算机类毕业论文中期检查表
- Django发送邮件(附代码)
- 字符间距加宽5磅怎么设置_如何设置将word文档的字符间距加宽
- SSM+图书馆电子文件资源管理 毕业设计-附源码191614
- selenium处理12306登录
- 小米玩机------MIUI里那些你可能不知道的冷知识
- SAP-MM-移动类型解析之收货02--价值评估冻结库存的收货
- Fiddler死活抓不了HTTPS包解决办法(2018更新版本)
热门文章
- 电脑w ndows无法自动修复,windows 10自动修复无法修复你的电脑
- Android 支付宝登录
- WCF RIA优缺点
- SQL中及Access的空值
- android beta项目官方页面,安卓7.0开发者预览版如何安装?Android Beta项目正式上线...
- linux 修改文件访问权限
- spring mvc 入门DispatcherServlet转发
- python三级联动菜单_VUE+element三级联动或树形菜单获取最后一项,并加入到表格中...
- 常用内存分配函数的说明
- 【Makefile由浅入深完全学习记录1】认识make和makefile