php 随机红包算法
固定红包就不用说了,等额发就行了。 目前主要说的是随机红包 直接上代码
<?php
$money = 1; // 红包大小
$num = 100; // 红包个数
$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;
}