速看!!剖析红包原理,教你抢红包的正确姿势 | 京东云技术团队

前言

叮咚~,红包来了!相信大家一定在日常生活中抢过红包,但每次都和"手气最佳"无缘。因此,大家都很好奇后台是如何分配红包金额的,那么今天和大家聊一下红包背后的原理,以及如何抢红包才是正确姿势!

一、红包背后的数学模型

相信不少人学习过高数、线代、概率论这些"印象深刻"的课程。以微信为例,微信红包在发放时采用了随机分配的方式,但是对于红包的金额分配,微信却进行了精密的计算。微信红包的数学模型是基于正态分布的数学模型,在生成红包时通过随机数进行金额的分配,确保了红包金额的公平性。

图1(来源于网络)

二、抢红包的算法

有人要问了,这个随机分配是如何随机的?让我们来看下微信红包算法的原文:

首先,如果红包只有一个,本轮直接使用全部金额,确保红包发完。

然后,计算出本轮红包最少要领取多少,才能保证红包领完,即本轮下水位;本轮最多领取多少,才能保证每个人都领到,即本轮上水位。

主要方式如下:

计算本轮红包金额下水位:假设本轮领到最小值1分,那接下来每次都领到200元红包能领完,那下水位为1分;如果不能领完,那按接下来每次都领200元,剩下的本轮应全部领走,是本轮的下水位。

计算本轮红包上水位:假设本轮领200元,剩下的钱还足够接下来每轮领1分钱,那本轮上水位为200元;如果已经不够领,那按接下来每轮领1分,计算本轮的上水位。

为了使红包金额不要太悬殊,使用红包均值调整上水位。如果上水位金额大于两倍红包均值,那么使用两倍红包均值作为上水位。换句话说,每一轮抢到的红包金额,最高为两倍剩下红包的均值。

最后,获取随机数并用上水位取余,如果结果比下水位还小,则直接使用下水位,否则使用随机金额为本轮拆到金额。

以上,就是微信团队公布的红包算法规则:二倍均值法。

复制代码
例:发 100 块钱,总共 10 个红包,那么平均值是 10 块钱一个,那么发出来的红包的额度在 0.01元~20元之间波动。
当前面 3 个红包总共被领了 40 块钱时,剩下 60 块钱,总共 7 个红包,那么这 7 个红包的额度在:0.01~(60/7 * 2)=17.14之间。
注意:这里的算法是每被抢一个后,剩下的会再次执行上面的这样的算法;如果最后不够分,则保证剩余用户拿到最低额度0.01元即可。

三、抢红包的影响因素

首先,我们要明白抢红包的顺序,分为抢包和拆包两个步骤,一个决定红包是否还有余额,另一个决定你能抢多少钱;手速过慢就可能导致属于你的运气王就被别人抢走了!!!那我到底是"天选之子"还是"倒霉之人"呢?首先首先我们来分析一下人们认为有影响的原因,比如抢的顺序,红包的总金额大小,抢的人数等,那么这些因素是否会影响呢?

我们来看下抢红包的概率分布,以5人抢50元红包为例:

图2(来源于网络)

如图,可以看到第1个人永远不会超过20 ,后面的这个规律分布在慢慢平缓下来。最佳手气在各个人各个位置的概率是均等的吗?其实也不是。最后发现最佳手气的概率在5个人抢的时候是依次递减的。所以手快的人永远抢不到手气最佳。

****上述实验中是5个人,那么如果人数变多呢,会有什么影响?

图3(来源于网络)

可以看到,随着人数的增多,抢到手气最佳的概率往往是后抢的人。

四、如何抢红包

根据上述的实验分析,红包的总金额大小及参与人数决定着你能抢到的最大金额,抢的顺序则注定了你和运气王的缘分。因此抢红包的正确姿势应该是(划重点):

憋一会等别人把小红包都抢走了,你就是运气王!

tips:别等太久,不然也抢不到

作者:京东保险 吴凯

来源:京东云开发者社区 转载请注明来源

相关推荐
GISer_Jing1 小时前
前端算法实战:大小堆原理与应用详解(React中优先队列实现|求前K个最大数/高频元素)
前端·算法·react.js
小森77672 小时前
(三)机器学习---线性回归及其Python实现
人工智能·python·算法·机器学习·回归·线性回归
振鹏Dong2 小时前
超大规模数据场景(思路)——面试高频算法题目
算法·面试
uhakadotcom2 小时前
Python 与 ClickHouse Connect 集成:基础知识和实践
算法·面试·github
uhakadotcom2 小时前
Python 量化计算入门:基础库和实用案例
后端·算法·面试
uhakadotcom3 小时前
使用 Python 与 BigQuery 进行交互:基础知识与实践
算法·面试
uhakadotcom3 小时前
使用 Hadoop MapReduce 和 Bigtable 进行单词统计
算法·面试·github
XYY3693 小时前
前缀和 一维差分和二维差分 差分&差分矩阵
数据结构·c++·算法·前缀和·差分
longlong int3 小时前
【每日算法】Day 16-1:跳表(Skip List)——Redis有序集合的核心实现原理(C++手写实现)
数据库·c++·redis·算法·缓存
24白菜头3 小时前
C和C++(list)的链表初步
c语言·数据结构·c++·笔记·算法·链表