讨论数量:
最近刚好也在看这个,我在其它地方看的算法
/**
* 发红包
* 每次抢到的金额都是剩余金额随机数, 最后一位直接全部获取到就可以了
* 这里有个问题,第一次抢到的钱应该是最多的,越往后金额越少
* 优化一下,每次抢到的金额在 1 和 剩余平均值*2 之间
* @param $money
* @param $num
*/
function hongBao($money, $num){
$data = [];
$leaveMoney = $money;
for($i = 1; $i <= $num; $i++){
if($i == $num){
$data[] = $leaveMoney; // 这里还是最后一个人获取全部的红包
}else{
$m = mt_rand(1, $leaveMoney/($num - $i + 1)*2); // 发送红包的金额
$leaveMoney = $leaveMoney - $m; // 剩余金额
$data[] = $m;
}
}
$num = 0;
foreach ($data as $v){
$num += $v;
}
echo "num = ".$num.PHP_EOL;
print_r($data);
}
// 100块钱发10个红包
hongBao(100, 10);
可以将红包放入队列里面,例如使用redis。当并发的时候,直接从队列里面pop。这样就不会出现多发的问题了。