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;
}

经过傲世的多次测试,抢到的红包面额在概率上是大致均匀的。

版权声明:若无特殊注明,本文为《傲世》原创,转载请保留文章出处。
本文链接:https://www.recho.cn/186.html
正文到此结束

热门推荐

发表吐槽

匿名评论 请叫我雷锋~

你还可以输入 250 / 250 个字

呵呵 哈哈 吐舌 开心 笑眼 可怜 乖 啊 你懂得 不高兴 生气 汗 黑线 哭 真棒 阴险 鄙视 酷 滑稽 纳尼 疑问 委屈 惊讶 勉强

评论信息框
可使用QQ号实时获取头像自动填写

私密评论

吃奶的力气提交吐槽中...


竟然没有人吐槽,快赶紧抢沙发吧!