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
$safe_total = ($total - ($amount - $i) * $min) / ($amount - $i);//随机安全上限
if ($min
$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 元