大家平时都在使用微信/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;
}
多次本人测试,抢到的红包面额在概率上是大致均匀的。
未经允许不得转载:作者:浅安,
转载或复制请以 超链接形式 并注明出处 浅安博客。