php根据总金额生成指定个数的随机红包,红包算法
/** * 根据总金额生成指定个数的随机红包 * 1、 微信红包, 每人最少分得1分钱 * 2、 每人分得到的金额是随机分配的 * 3、 每次生成红包就生成了对应领取红包的结果 * 生成随机红包 * Class redPacket */ class redPacket { //总金额 private $total = 0; //红包数量 private $amount = 0; //最小红包金额 private $min = 0.01; public function __construct($total, $amount, $min) { $this->total = $total; $this->amount = $amount; $this->min = $min; } /** * @return bool */ public function getPacket() { $total = $this->total; $amount = $this->amount; $min = $this->min; if ($amount * $min > $total) { return false; } $money = 0; for ($i = 1; $i < $amount; $i++) { $safe_total = ($total - ($amount - $i) * $min) / ($amount - $i);//随机安全上限 if ($min < $safe_total) { $money = mt_rand($min * 100, $safe_total * 100) / 100; } else { $money = $min; } $total = $total - $money; $redPacket[] = [ 'money' => $money, 'balance' => $total, ]; } //最后一个红包, $redPacket[] = [ 'money' => $total, 'balance' => 0, ]; return $redPacket; } }
使用方法
$total = 12.12;//红包总金额 $amount = 11;// 分成11个红包, 支持11人随机领取 $min = 0.01;//每个人最少能收到0.01元 $redPacket = new redPacket($total, $amount, $min); $result = $redPacket->getPacket(); foreach ($result as $key => $val) { echo '第' . ($key + 1) . '个红包: ' . $val['money'] . ' 元, 余额: ' . $val['balance'] . ' 元' . "\n"; } echo array_sum(array_column($result, 'money')); //12.12
结果
第1个红包: 0.61 元, 余额: 11.51 元 第2个红包: 0.13 元, 余额: 11.38 元 第3个红包: 0.25 元, 余额: 11.13 元 第4个红包: 0.69 元, 余额: 10.44 元 第5个红包: 1.55 元, 余额: 8.89 元 第6个红包: 0.94 元, 余额: 7.95 元 第7个红包: 1.47 元, 余额: 6.48 元 第8个红包: 0.2 元, 余额: 6.28 元 第9个红包: 1.87 元, 余额: 4.41 元 第10个红包: 2.21 元, 余额: 2.2 元 第11个红包: 2.2 元, 余额: 0 元