红包分配代码

    $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,得到的就是每个红包的真正数额

转载于:https://my.oschina.net/zzlzheng/blog/813696

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值