$money = 10; // 红包大小 $num = 10; // 红包个数 $min = 0.01; // 单个红包最低金额 $ret = lottery($money, $num, $min); if (! is_array($ret)) { exit($ret.PHP_EOL); } echo '手气最佳:'.max($ret).PHP_EOL; echo '手气最差:'.min($ret).PHP_EOL; echo PHP_EOL; print_r($ret); //---------------------------------------------------------------------- // 产生一个随机浮点数 function random_float($min = 0, $max = 1) { return round($min + mt_rand() / mt_getrandmax() * ($max - $min), 2); } // 微信随机红包模拟算法 function lottery($sum_money, $num, $min_money = 0.01) { if ($sum_money < $num * $min_money) { return '钱不够'; } $list = []; for ($i = 1; $i <= $num; $i++) { // 剩余的可分配金额,需要确保剩下的人每人都至少可以拿到保底的钱 $remain = $sum_money - array_sum($list) - ($num - $i + 1) * $min_money; if ($i < $num) { // 前面的人随机获得 // 每轮抽取的金额范围:0 至 剩余金额平均值的两倍 $get = random_float(0, $remain / ($num - $i + 1) * 2); } else { // 最后一个人拿全部剩下的 $get = $remain; } // 最后再将每个人保底的钱加上 $list[] = round(round($get, 2) + $min_money, 2); } return $list; }