前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PHP 拼手气红包分配算法

PHP 拼手气红包分配算法

作者头像
很酷的站长
发布2022-12-19 15:31:00
1.1K0
发布2022-12-19 15:31:00
举报
文章被收录于专栏:站长的编程笔记
1. 前言

在公司的一个项目中有红包抽奖活动,其中有拼手气红包。

在网上找了别人封装的红包分配算法,但是都存在问题,索性就自己手写了一个

2. PHP 拼手气红包分配算法

代码语言:javascript
复制
/**
* 拼手气红包分配算法
*
* @param $money 金额
* @param $count 数量
*/
function redAlgorithm($money, $count)
{
// 参数校验
if ($count * 0.01 > $money) {
throw new \Exception("单个红包不能低于0.01元");
}
// 存放随机红包
$redpack = [];
// 未分配的金额
$surplus = $money;
for ($i = 1; $i <= $count; $i++) {
// 安全金额
$safeMoney = $surplus - ($count - $i) * 0.01;
// 平均金额
$avg = $i == $count ? $safeMoney : bcdiv($safeMoney, ($count - $i), 2);
// 随机红包
$rand = $avg > 0.01 ? mt_rand(1, $avg * 100) / 100 : 0.01;
// 剩余红包
$surplus = bcsub($surplus, $rand, 2);
$redpack[] = $rand;
}
// 平分剩余红包
$avg = bcdiv($surplus, $count, 2);
for ($n = 0; $n < count($redpack); $n++) {
$redpack[$n] = bcadd($redpack[$n], $avg, 2);
$surplus = bcsub($surplus, $avg, 2);
}
// 如果还有红包没有分配完时继续分配
if ($surplus > 0) {
// 随机抽取分配好的红包,将剩余金额分配进去
$keys = array_rand($redpack, $surplus * 100);
// array_rand 第二个参数为 1 时返回的是下标而不是数组
$keys = is_array($keys) ? $keys : [$keys];
foreach ($keys as $key) {
$redpack[$key] = bcadd($redpack[$key], 0.01, 2);
$surplus = bcsub($surplus, 0.01, 2);
}
}
// 红包分配结果
return $redpack;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 前言
  • 2. PHP 拼手气红包分配算法
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档