$total=intval($total*100);
$total_money=$total-$num;
$i=$num;
while($i>1){
$max=$total_money*2/$i;
$now_bage=intval(mt_rand(0,$max));
$bage[]=$now_bage;
$total_money=$total_money-$now_bage;
$i--;
}
$bage[]=$total_money;
shuffle($bage);
for ($j = 0; $j < $num; $j++) {
$now_bage=$bage[$j]+1;
$total=$total-$now_bage;
$money=$now_bage/100;
$data['rank'][] = array($j, $money, $total/100);
// echo '第'.$i.'个红包:'.$money.' 元,余额:'.$total/100.' 元 <br/>';
}
以上代码是参考了知乎中大神们猜测的微信红包分配机制,改进后的实现方式。
思路是这样的。
第一步:每人最低为0.01,所以,每个人先分0.01,剩余部分随机分;
第二步:假设剩余100元钱,分给十个人。那么第一个人获得红包大小怎么计算呢?100/10 = 10元。这是期望值。从0.00到20.00的区间中(其中20=10乘以2)随机抽取一个数,就是第一个人获得红包的大小。假设第一个人获得了15元,那么剩下的85元平均分给9个人,这九个人平均获得红包大小为9.4元,那么第二个人的红包大小均匀分布于0.00元到18.80元的区间中,依次类推。最后一个红包就直接用剩余金额,不用随机。
第三步:乱序第二步中获得的红包数额数组
第四步:第三步中获得的一列值,每个都加上0.01,得到的就是每个红包的真正数额