美文网首页IT大咖说
别人在抢微信红包的时候,程序员在研究红包的算法实现

别人在抢微信红包的时候,程序员在研究红包的算法实现

作者: IT大咖说 | 来源:发表于2018-12-06 14:25 被阅读0次

作者:Small

链接:http://blog.cqcoder.com/微信红包的算法实现探讨/

突发奇想给校友微信群发了红包,我设定红包总额为10元,支持28个人随机领取

于是一个有趣的结果出现了

A 领取了 0.26元

B 领取了 0.29元

C 领取了 0.02元

D 领取了 0.56元

E 领取了 0.64元

……

微信是采用什么样的算法做到的?简单百度了下,目前尚未有官方的说明,仅仅在知乎里有一个较为热门的讨论,不过他们讨论的太过于深入,有掉坑之嫌。

我按照自己的逻辑尝试了下,这个算法需要满足以下几点要求:

1、每个人都要能够领取到红包;

2、每个人领取到的红包金额总和=总金额;

3、每个人领取到的红包金额不等,但也不能差的太离谱,不然就没趣味;

4、算法一定要简单,不然对不起腾讯这个招牌;

正式编码之前,先搭建一个递进的模型来分析规律

设定总金额为10元,有N个人随机领取:

N=1 

则红包金额=X元; 

N=2 

为保证第二个红包可以正常发出,第一个红包金额=0.01至9.99之间的某个随机数 

第二个红包=10-第一个红包金额; 

N=3 

红包1=0.01至0.98之间的某个随机数 

红包2=0.01至(10-红包1-0.01)的某个随机数 

红包3=10-红包1-红包2 

……

至此,规律出现啦!开始编码!

header("Content-Type: text/html;charset=utf-8");//输出不乱码,你懂的

$total=10;//红包总额

$num=8;// 分成8个红包,支持8人随机领取

$min=0.01;//每个人最少能收到0.01元

for ($i=1;$i<$num;$i++)

{

$safe_total=$total-($num-$i)*$min;//随机安全上限

$money=mt_rand($min*100,$safe_total*100)/100;

$total=$total-$money;

echo '第'.$i.'个红包:'.$money.' 元,余额:'.$total.' 元 <br/>';

}

echo '第'.$num.'个红包:'.$total.' 元,余额:0 元';

输入一看,波动太大,这数据太无趣了!

第1个红包:7.48 元,余额:2.52 元 

第2个红包:1.9 元,余额:0.62 元 

第3个红包:0.49 元,余额:0.13 元 

第4个红包:0.04 元,余额:0.09 元 

第5个红包:0.03 元,余额:0.06 元 

第6个红包:0.03 元,余额:0.03 元 

第7个红包:0.01 元,余额:0.02 元 

第8个红包:0.02 元,余额:0 元

改良一下,将平均值作为随机安全上限来控制波动差

header("Content-Type: text/html;charset=utf-8");//输出不乱码,你懂的

$total=10;//红包总额

$num=8;// 分成8个红包,支持8人随机领取

$min=0.01;//每个人最少能收到0.01元

for ($i=1;$i<$num;$i++)

{

$safe_total=($total-($num-$i)*$min)/($num-$i);//随机安全上限

$money=mt_rand($min*100,$safe_total*100)/100;

$total=$total-$money;

echo '第'.$i.'个红包:'.$money.' 元,余额:'.$total.' 元 <br/>';

}

echo '第'.$num.'个红包:'.$total.' 元,余额:0 元';

输出结果见下:

第1个红包:0.06 元,余额:9.94 元 

第2个红包:1.55 元,余额:8.39 元 

第3个红包:0.25 元,余额:8.14 元 

第4个红包:0.98 元,余额:7.16 元 

第5个红包:1.88 元,余额:5.28 元 

第6个红包:1.92 元,余额:3.36 元 

第7个红包:2.98 元,余额:0.38 元 

第8个红包:0.38 元,余额:0 元

如果你有更好更简单的算法,欢迎讨论。

编者:IT大咖说,转载请标明版权和出处

相关文章

  • 别人在抢微信红包的时候,程序员在研究红包的算法实现

    作者:Small 链接:http://blog.cqcoder.com/微信红包的算法实现探讨/ 突发奇想给校友微...

  • PHP 仿微信红包金额随机

    博主寒冰最近闲来无事。就想研究一下微信红包的金额随机算法。早在微信红包刚出来的时候就研究过。始终不得要领。后来,通...

  • 我也来谈谈类似微信红包算法实现

    最近在做一个类似微信红包的 拼手气红包的算法实现。 需求: 客户抛出一个想法 :他想在他的APP中加入类似微信红包...

  • 微信红包随机算法初探

    本文简书备份地址:微信红包随机算法初探 最近看了一篇文章,讲微信红包随机算法的。感觉很不错,所以自己实现了下,并进...

  • Java实现4种微信抢红包算法

    概述 14年微信推出红包功能以后,很多公司开始上自己的红包功能,到现在为止仍然有很多红包开发的需求,实现抢红包算法...

  • 《抢红包》

    微信红包 前面的一个 通常是很小的 不要抢 犹豫着 在犹豫中点开红包 手慢了 红包派完了

  • 正态分布

    最近公司产品上线一个类似于微信抢红包功能,需要实现红包金额的随机分配算法。 基本约束: 发放红包时,每个人所能得到...

  • 红包算法

    微信红包 初一,一家人聚在一起发红包,便对微信红包算法产生了些兴趣。ps:这里说的是群红包 。 普通红包 首先...

  • 2017,定个小目标:不抢红包

    元旦的时候,我所在的微信群,几乎都陆续出现了红包雨的现象,大家发红包的发红包,抢红包的抢红包,时间就在这一发一抢中...

  • 微信红包算法MATLAB实现

    上午看到基友分享的微信红包算法的文章,代码很短,春节期间红包太火了,看完就也想实现下玩玩,原代码是JAVA的,没接...

网友评论

    本文标题:别人在抢微信红包的时候,程序员在研究红包的算法实现

    本文链接:https://www.haomeiwen.com/subject/xshocqtx.html