php 固定人数拼手气_PHP实现微信/QQ手气红包,随机算法分享

大家平时都在使用微信/QQ收发红包,玩的不亦乐乎。别人在抢红包,而程序员在研究红包算法。那么手气红包的随机分配算法是怎么实现的呢?怎么保证没人都领得到,而且满足正态分布呢?经过一个晚上的时间,通过网上搜寻和自己优化,终于把算法测试完毕了,顺道分享一下!

逻辑:

红包金额100元,10个人分。

第一份:系统由0.01~100元之间随机一个数,作为这一份的钱数,设x1。

第二份:剩下的钱(100-x1),系统由0~(100-x1)/(10-1)随机一个数,作为这份的钱数,设x2。

依次类推

第n份:剩下的钱(100-x1-x2-…-xn),系统由0~(100-x1-x2-…-xn-1)/(10-n)随机一个数,作为这个份的钱数,设为xn

根据逻辑我们可以推算出如下PHP代码:

/**

* 拼手气红包随机算法

* @param int $min 可以抢到的最小金额

* @param int $num 剩余的红包数量

* @param int $remainmoney 剩余的钱

*/

function getRandomMoney($min, $num,$remainmoney) {

if ($num == 1) {

$num --;

return round($remainmoney * 100) / 100;

}

$max = $remainmoney / $num * 2;

$money = mt_rand() / mt_getrandmax() * $max;

$money = $money <= $min ? $min : $money;

$money = floor($money * 100) / 100;

$num--;

$remainmoney -= $money;

return $money;

}

多次本人测试,抢到的红包面额在概率上是大致均匀的。

未经允许不得转载:作者:浅安,

转载或复制请以 超链接形式 并注明出处 浅安博客。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值