首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

清华的博士一天发五千万个红包,研究抢红包的规律

春节抢红包大家都玩过,现在抢红包已经是我们每年过年的一个全民竞技体育了,每个人抢到那几分钱都特别地开心。

但有段时间我发现了一个奇怪的现象,就是不管别人发多大的红包,抢到我手里的每次都只有几分钱。而往往是抢红包比较晚的那些人,他们可以抢到一个比较大的红包。

这不科学吧?我说腾讯这么大的一个公司,它没有必要在算法上针对我呀。难道微信红包先抢和后抢的规律是不一样的?想到这个想法我非常地兴奋,我觉得如果我最后能找到这个规律的话,我就能抢到我所有的同学都破产为止。

马上又开始实验了。我在周围借来了四部手机,连上我自己的一部,总共是五部手机,建了个五人群开始发红包。发红包之前我先做了这么一个先导实验:N个人抢N+1分钱。

大家都学过抽屉原理,N个人抢N+1分钱就应该有一个人抢到2分钱,剩下的人都抢到1分钱。但实际做出来实验结果不是这样的,永远只有最后那个人才能抢到那个2分钱。

我做了非常多次实验,结果肯定是对的。这个东西我把它命名为末位红包抽屉原理。也就是N个人抢N+1分钱,则必有最后一个人抢到2分钱。这个收益率很可怕,他的收益率达到了前面一个人的两倍。

这个结果虽然很简单,但是它反映出来一个现象,就是微信红包的内部算法肯定不是均匀的,先抢后抢一定是有区别的,而且貌似后抢会占一点点优势。

究竟是不是这样呢?我做了一个进一步的实验。

我用5个人抢50块钱的红包,发了150次,然后统计了每一次这5个人的数据,得到这样750个数据。我把750个数据做在一张表上面。

大家可以看出来,很惊讶的一个结果:5个人抢50块钱的红包,第一个人从来没有超过20块钱。做了150次,所以统计规律肯定是没有问题的。第二个人从来没有超过过25块钱,等到第三第四第五的人他们能抢到的钱数慢慢才上去。

如果我们做一个统计学的分析,从平均值上来看,其实5个人抢到的钱差不多,都是在10块钱左右,5个人抢50块钱嘛。但如果从它的标准差,就是一个波动的情况,你会发现标准差越来越大。也就说第一个人可能只能抢到0到20,第四第五的人才能抢到0到50中间的任一个数字。

后来经过我仔细地研究,我终于发现了微信红包内部的算法规则是什么,每个人当前能抢到的金额服从一个0.01到当前剩余均值两倍的左开右闭区间的均匀分布。

什么意思呢?大概是说,5个人抢50块钱,那平均每个人能抢到10块钱。这个时候,第一个人抢的时候,他就只能抢到0—10×2也就是20块钱。你想第一个人多不巧,他只抢到了2块钱。那接下来的问题就变成了4个人抢48块钱,这个时候平均每个人能抢到12块钱。12的两倍是24,第二个人最大能抢到就变成24块钱。所以这个区间是一个不断放大的过程。

最后等我发现了这个规律之后,你就可以做一些很无聊的脑洞。比如说你可以编程给自己发红包,然后有一天我就给自己发了五千万个红包,得出来这样一个规律。

在五千万个红包下面这个规律就非常地明显了。你可以看到第1个人永远不会超过20,后面的这个规律分布在慢慢平缓下来。

此外,通过编程你还可以统计一个现象,就是最佳手气,这是很多人关注的一个点。最佳手气在各个人各个位置的概率是均等的吗?其实也不是。最后我发现最佳手气的概率在5个人抢的时候是依次递减的。

然后我的脑洞又发散了一下,我说难道5个人是这样,那几个人抢都是这样吗?于是我又做了一个编程,很无聊,就给自己发了两亿个红包。最后做出来这样一张图。

这张图可以说是微信抢红包里面包罗万象,它把所有的情况都概括了。它统计出了从3个人抢到27个人抢,如果你愿意的话,我可以统计到任何多个人抢。从3个人到27个人,不同的人在抢红包的时候,每一个位置抢到手气最佳的概率这个变化究竟是什么样子的。

从这张图的最后我大概得出一个结论,就是通常抢红包的人比较多的时候,应该是越往后往往抢到手气最佳的概率越大。所以以后我看到红包都先憋一会儿,我等你们先把前面的小红包都抢走了,憋到后面我再去把那个大的捞回来。

后来在这种思想的指导下,我就再也没有抢到过红包。

有用的事情的人。我觉得本来一个单纯好玩的事在你要求它变得有用的时候,那一个瞬间它就变得不好玩了。

明显上面的分析,只是黑盒测试。属于书生气比较重的,试验性探索。

工程师思路的话,应该是去看具体的代码。明确其算法。通过白盒的理论分析,结合实际的测试,才能得出可靠的结论。

工程师的思路,永远都是:理论指导加实际验证。

有人问过微信的人,大致是这样:

先上代码:

以上代码仅供参考,涉及商业计算要用java.math.BigDecimal. 感谢

@xin lu @秦时明月指出。

再说结论:

先抢后抢拿到红包的大小的期望是大致相等的,所以还是先下手抢吧

后抢的人方差大(依赖前面人抢的多少),波动较大,有较大几率拿到“手气最佳”

注意:方差大,但是均值其实是一致的。上面那位呆博士的测试模型与实际抢红包的测试模型,其实是有差异的。测试环境差异,可能会产生误导性结论。

测试数据。

测试结果测试随机红包

以上面的初始化数据(30人抢500块),执行了两次,结果如下:

对应图表如下:

还有一张:

多次均值

200次

2000次

可以看到,这个算法可以让大家抢到的红包面额在概率上是大致均匀的。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180216B0PV7A00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

相关快讯

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券