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(转载时请注明本文出处及文章链接)