php红包开发的两个模式,按总金额、按最高最低
php红包开发的两个模式,代码如下
<?php
//按总金额随机发放红包,先抢先得,最低0.3元,最高5元 预计1000元能发350-400个红包,抢完总金额就结束;单个的红包金额相对指定红包数的模式会多些。
//按总金额随机发放红包,先到先得,最低0.3元,最高5元 预计1000元能发350-400个红包
$srcMoney = $money = 1000; //红包总金额
$minMoney = 0.30; //最少的红包金额
$maxMoney = 5; //最高的红包金额
$temPool = [];
while ($money > $minMoney) {
//随机产生的红包金额
$cash = mt_rand($minMoney * 100, $maxMoney * 100) / 100;
//统计已经在队列里的红包总金额
$totMoney = array_sum($temPool);
//如果已存在总金额+生成的总金额大于了 可以发放的总金额,则修改产生的
if ($totMoney + $cash > $srcMoney) {
$cash = round($srcMoney - $totMoney, 2);
}
//修改总金额
$money = round($money - $cash, 2);
$temPool[] = $cash;
}
dd($money);
dd('总共:' . count($temPool) . '个红包');
dd('发出去的红包金额:' . array_sum($temPool) . '元');
dd('剩余金额:' . round($money, 2) . '元');
dd('最大金额:' . max($temPool) . '元');
dd('最小金额:' . min($temPool) . '元');
dd($temPool);
//按总金额:1000元,指定红包数量600个,发放最低金额:0.30元,最高金额:(1000/600*4) ≈ 7 元以下,抢完总数量就结束;单个的红包金额不多。
$money = 1000; //红包总金额
$number = 600; //红包的数量
$minMoney = 0.30; //最少红包金额
$maxMoney = round($money / $number * 4); //最多红包金额
$ll = getRedPackage($money, $number, $minMoney, $maxMoney);
dd('总金额:' . array_sum($ll));
dd('总数量:' . count($ll));
dd('最大红包:' . max($ll));
dd('最小红包:' . min($ll));
dd($ll);
#红包算法 (最大金额和最小金额)
function getRedPackage($money, $num, $min, $max)
{
$data = array();
if ($min * $num > $money) {
return '老板,钱不够啊!';
}
if ($money / $num > $max) {
return '最大金额不能小于: ' . $money / $num . '元!';
}
if ($max * $num < $money) {
return '最大的红包综合值不能小于发放的总金额啊!';
}
while ($num >= 1) {
--$num;
$kmix = max($min, $money - $num * $max);
$kmax = min($max, $money - $num * $min);
$kAvg = $money / ($num + 1);
//获取最大值和最小值的距离之间的最小值
$kDis = min($kAvg - $kmix, $kmax - $kAvg);
//获取0到1之间的随机数与距离最小值相乘得出浮动区间,这使得浮动区间不会超出范围
$r = ((float)(mt_rand(1, 10000) / 10000) - 0.5) * $kDis * 2;
$cash = round($kAvg + $r, 2);
$money -= $cash;
$data[] = $cash;
}
return $data;
}
/**
* 数据打印格式化
* @param $data
* @param int $exit
*/
function dd($data, $exit = 0)
{
echo '<pre>';
print_r($data);
echo '</pre>';
if ($exit) exit();
} Dcr163的博客
http://dcr163.cn/259.html(转载时请注明本文出处及文章链接)