PHP红包算法什么时候用到,如何实现
Admin 2022-08-27 群英技术资讯 995 次浏览
这篇文章给大家介绍了“PHP红包算法什么时候用到,如何实现”的相关知识,讲解详细,步骤过程清晰,有一定的借鉴学习价值,因此分享给大家做个参考,感兴趣的朋友接下来一起跟随小编看看吧。根据很多需求的使用场景,如发红包、砍价类需求,这两个功能都有一个同样的特点,如下:
红包
1.总金额
2.红包个数
3.最小红包数量
砍价
1.砍价总金额
2.需要多少人完成砍价(人数根据需求而定)
3.最小砍价金额
开发思路
最小金额不允许小于0
总金额不允许大于数量乘最小金额
取得平均金额(总金额/剩余数量)
分配金额 平均金额小于等于最金额时直接分配最小金额
获取金额幅度比例最小值不允许小于-1最大值不允许大于1
得出分配金额 幅度计算(平均值*(1+幅度比例))
分配金额判断分配金额小于最小金额或者分配金额大于可领取最大金额((最小金额+剩余总金额)- (剩余数量×最小金额))时 重新分配金额
剩余最后一个则剩余所有金额都分配
开发代码
<?php
/**
* 发送红包
* Class sandRed
*/
class sandRed
{
#红包金额
protected $amount;
#红包个数
protected $num;
#领取的红包最小金额
protected $minAmount;
#红包分配结果
protected $amountArr = [];
public function __construct($amount, $num = 1, $minAmount = 1)
{
$this->amount = $amount;
$this->num = $num;
$this->minAmount = $minAmount;
}
/**
* 处理返回
* @return array
* @throws Exception
*/
public function handle()
{
# 验证
if ($this->amount < $validAmount = $this->minAmount * $this->num) {
throw new Exception('红包总金额必须≥'.$validAmount.'元');
}
# 分配红包
$this->allot();
return $this->amountArr;
}
/**
* 分配红包
*/
protected function allot()
{
# 剩余可分配的红包个数
$num = $this->num;
# 剩余可领取的红包金额
$amount = $this->amount;
while ($num >= 1) {
if ($num == 1) {
# 剩余一个的时候,直接取剩余红包
$coupon_amount = $this->formattingAmount($amount);
} else {
# 平均金额
$avgAmount = $this->formattingAmount($amount / $num);
# 分配金额
$countAllotAmount = $this->countAllotAmount($avgAmount, $amount, $num);
# 剩余的红包的平均金额
$coupon_amount = $this->formattingAmount($countAllotAmount);
}
# 追加分配金额
$this->amountArr[] = $coupon_amount;
# 计算剩余金额
$amount -= $coupon_amount;
$num--;
}
# 随机打乱
// shuffle($this->amountArr);
}
/**
* 计算分配的红包金额
* @param float $avgAmount 每次计算的平均金额
* @param float $amount 剩余可领取金额
* @param int $num 剩余可领取的红包个数
* @return float
*/
protected function countAllotAmount($avgAmount, $amount, $num)
{
# 如果平均金额小于等于最低金额,则直接返回最低金额
if ($avgAmount <= $this->minAmount) {
return $this->minAmount;
}
# 浮动比率
$floatingRate = $this->floatingRate();
# 分配金额
$allotAmount = $avgAmount * (1 + $floatingRate);
# 浮动计算
$coupon_amount = $this->formattingAmount($allotAmount);
# 如果低于最低金额或超过可领取的最大金额,则重新获取
if ($coupon_amount < $this->minAmount || $coupon_amount > $this->canReceiveMaxAmount($amount, $num)) {
return $this->countAllotAmount($avgAmount, $amount, $num);
}
return $coupon_amount;
}
/**
* 计算分配的红包金额-可领取的最大金额
* @param $amount
* @param $num
* @return float|int
*/
protected function canReceiveMaxAmount($amount, $num)
{
return $this->minAmount + $amount - $num * $this->minAmount;
}
/**
* 红包金额浮动比例
* @return float|int
*/
protected function floatingRate()
{
# 60%机率获取剩余平均值的大幅度红包(可能正数、可能负数)
if (rand(1, 100) <= 60) {
# 上下幅度70%
return rand(-70, 70) / 100;
}
# 其他情况,上下浮动30%;
return rand(-30, 30) / 100;
}
/**
* 格式化金额,保留2位
* @param $amount
* @return string
*/
protected function formattingAmount($amount)
{
return sprintf('%01.2f', round($amount, 2));
}
}
$amount = 1;
$num = 10;
$minAmount = 0.01; $red = new sandRed($amount, $num, $minAmount); $res = $red->handle(); print_r($res);
echo array_sum($res);
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
引用传递可以将一个变量通过引用传递给函数,这样该函数就可以修改其参数的值。语法如下:<?phpfunctionfoo(&$var){$var++;}$a=5;fo...
多个任务同时执行 将顺序执行的任务,转化为并行执行(任务在逻辑上可以并行执行)比如,我们要对已知的用户数据进行判断,是否需要发送邮件和短信,如果需要发送则发送。不使用多进程时,我们首先判断是否发送邮件,如果需要则发送;然后再判断是否需要发送短信,如果需要则发送。如果发送邮件耗时2s,发送短信耗时2s,那么我们完成任务大概需要4s左右的时间。
本文实例讲述了PHP数组基本用法与知识点。分享给大家供大家参考,具体如下:
php $this的意思:1、$this是一个到当前对象的引用。在$this中有个指针,谁调用它,他就指向谁,它只能再类内部使用。2、$this不能用来访问静态属性, 因为静态属性是和类绑定的。
今天小编就为大家分享一篇解决tp5在nginx下修改配置访问的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 ICP核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008