微信红包之我见
Filed under الرياضيات, نظرية الاحتمال on ١١ فبراير ٢٠٢٥. Last updated on ١١ فبراير ٢٠٢٥.
toc
概览
不知不觉中,微信红包已经陪伴了我们多年。从2014年诞生至今,微信红包已经成为了中国人民生活中不可或缺的一部分。另外,“红包”这种增长工具,也成为了各个公司竞相模仿的对象。
如果大家对于微信支付以及微信红包的历史不感兴趣,可以直接跳转到红包背后的数学原理,从数学的角度来了解一下红包背后的原理,以及相关的实现。
微信红包崛起
2014年,是我在腾讯的最后一年,也是中国移动支付市场竞争白热化的一年。彼时,在中国互联网支付领域,阿里系的支付宝占据着绝对的统治地位,而腾讯的财付通虽然也是头部的第三方支付,但是市场份额和支付宝相比,差距甚远。
然而,微信红包的诞生,彻底改变了这一局面。本就以社交见长的腾讯,在微信红包病毒式传播的加持下,迅速在移动支付领域占据了一席之地,成为了在支付领域可以和支付宝分庭抗礼的存在。
腾讯的开工利是
作为一家在广东起家的公司,腾讯在过年期间给员工发放开工利是,已经成为了传统。每年春节后开工的第一天,抢红包、聚餐是所有腾讯员工当天的重点。所有红包中,最重要的莫过于总办红包。 当天,总办的老板们都会在办公室门口,亲自把红包发到每一位排队领总办红包的同事手中。红包本身都是次要的,但是领红包的氛围,以及跟老板见面的机会,才是最重要的。
在早些年,腾讯的员工数还相对较少,总办的老板们还能亲自发红包。但是随着腾讯的快速发展,员工数迅速增长,如何高效地发红包,也就成了一个问题。据说,微信红包的诞生,就是来源于这个问题。
腾讯的创新文化
腾讯的企业文化,相较于中国其他互联网公司,一直是很开放,很包容的。在这个大背景下,赛马机制也催生了很多创新的产品。按理来说,微信红包这种产品,应该由微信团队来负责,但是实际上,微信红包的诞生,基本可以认为是财付通团队的产品。
据传,微信红包是由一个产品经理和三个开发立项的,且他们都是财付通的核心团队成员。逐渐地,微信支付这个品牌成为了微信和财付通两个团队的公约数。
微信红包给市场的启示
在微信红包之前,“红包”这种增长工具,似乎从来没有出现过。个人认为,有以下原因:
-
在微信红包之前,个人钱包这个概念,并没有被广泛地普及开来。
虽然支付宝是重要的第三方支付渠道,也有自己独立的账户余额体系,但是大家更多地是把它作为银行账户的补充,而不是一个独立的钱包。支付宝也有基于账户的产品,比如余额宝,但是余额宝的本质,是货币基金,而不是一个钱包的高频应用。
同期,余额宝已经有很高的市场份额,看起来支付宝并没有动力去开发另一个钱包的应用场景。
-
市场对于第三方支付,以及移动支付能做什么,还在探索阶段。
在微信红包之前,大家对于移动支付的想象,大多数还停留在支付层面,也就是买卖双方完成付款即可。微信红包这种产品,跳出了支付的范畴,让大家意识到,移动支付可以有更多的玩法。
微信红包的成功,特别是微信支付完成对支付宝的追赶,很大程度上得益于微信红包的病毒式传播,也让所有人看到了其中的增长潜力,看到了除了支付之外的更多可能性。本质上,交易的双方,由“买家”和“卖家”,变成了“用户”和“用户”。
红包背后的数学原理
那么,如果我们想要设计一个红包产品,应该如何设计呢?在此,我仅抛砖引玉,分享一下个人的一些想法。
本质上,红包是一个概率的游戏,所以在此还需要重温一下概率论的一些基本概念:随机变量和概率分布。
如果想直接看结论,可以跳转到红包背后的产品设计和技术要点。
随机变量及其概率分布
假设我们现在有一组数据:
2.17, 6.22, 16.00, 6.53, 16.54, 0.39, 1.79, 5.97, 15.50, 2.82...
另外一组数据:
11.46, 16.76, 4.64, 10.63, 10.61, 14.09, 12.57, 13.33, 7.98, 9.67...
请问你能看出这两组数据的区别吗?当然很难一眼看出来。那么我们画个图。
结果就一目了然了。这两组随机变量的概率分布,分别是均匀分布和三角分布。
如何精确描述随机变量
我们能够绘制出随机变量的概率分布图,但是这还不够。如果我们想要实现一个随机变量生成函数,我们需要更加精确地描述随机变量的概率分布。
均值
首先需要强调的是,有些概率分布是没有均值的,比如柯西分布。我们这里不需要考虑没有均值的分布。对于红包这种产品,我们肯定希望红包金额是有均值的,否则不同用户获得的红包金额差异过大,影响用户体验。
方差,标准差
方差和标准差,是描述随机变量离散程度的两个重要指标。方差和标准差越大,随机变量的离散程度越大。
区间
在红包随机金额有均值和方差的情况下,我们还需要考虑红包金额的区间。有些随机分布,其区间是无限的,比如正态分布。如果我们希望使用正态分布,那么我们需要对随机变量进行截断,以保证红包金额的区间有限。
红包背后的产品设计和技术要点
定义一个红包,我们需要两个用户输入的参数:红包个数和总金额。
本质上来讲,红包就是一个既要公平,又要有趣的游戏。公平是基础,有趣是关键。如果红包的金额完全随机,那么用户可能会因为金额太小而感到失望;如果红包的金额完全固定,那就没有任何乐趣可言。
产品设计
对于随机的红包金额,基于以上需求,我们至少需要满足以下两个条件:
- 红包金额的期望值,应该尽量相等。
- 红包金额的方差,应该在合理范围内,不能太小,也不能太大。
另外还有一些附加的限制条件需要考虑:
- 红包金额应该有一个最小值,且不为负数。
- 红包金额应该有一个最大值,且不能超过总金额。
技术要点
概率分布
为了简化我们的实现,我们默认以均匀分布来讨论。后续可以考虑其他分布,比如正态分布。
首先,如果要保证红包金额有均值,那么红包金额的期望值,应该尽量相等。且红包金额的期望值,应该尽量接近总金额的平均值。我们按照此思路,假设红包总金额为100,个数为10,且每次红包金额的期望值为10。
随机运行10000次,我们得到以下结果:
然而,观察上图,我们发现,每个玩家获得红包的期望值,并不等于10。这是因为,我们使用了静态均值。而随着红包的领取,靠后的玩家获得同样期望值的概率会降低。 到了最后一个玩家,由于兜底逻辑的存在,即最后一名玩家获取到的是剩余红包金额,而非随机值,所以最后一个玩家获得红包金额的期望值会大于10。
动态均值
为了解决静态均值的问题,我们引入动态均值,使每次红包金额的期望值,都等于剩余红包金额的平均值。
还是随机运行10000次,这次我们得到以下结果:
从这次模拟的结果来看,动态均值能够很好的解决均值差异的问题。然而,我们注意到,红包金额的离散程度,虽然不会出现静态均值情况下的跳变,但是还是存在递增的情况。
在线算法 or 离线算法
在红包金额生成的算法中,我们还默认了一个假设,即红包金额的生成是在线的。每次红包金额的生成,都会依赖之前的上下文;红包金额生成之后,立即更新上下文,并用于下一次红包金额的生成。
然而,在实际的红包场景中,红包金额的生成,是否需要使用在线算法,可能需要根据实际情况来判断。如果我们可以离线生成红包金额,那么在动态均值的基础上,再引入洗牌算法,可以得到一个更加公平的红包金额。
从这次模拟的结果来看,洗牌算法能够很好的解决红包金额的离散程度的问题。从直觉上也很好解释,因为洗牌算法能够很好的打乱红包金额的顺序,从而使得红包金额的离散程度更加均匀。
总结
以上,我们讨论了红包金额的生成算法,并给出了相应的模拟结果。要点如下:
- 确定红包金额的概率分布。
- 引入动态均值,保证红包金额的期望值尽量相等。
- 根据实际情况,引入洗牌算法,保证红包金额的离散程度尽量均匀。
实际的开发中,还有许多细节需要考虑,这里就暂时不展开了。
蒙特卡罗方法
在以上的模拟中,我都使用了蒙特卡罗方法。通过绘制相关数据的概率分布,我们可以很直观地看到概率分布情况,并且对模拟结果有直观的理解。这里有一个交互式的工具,可以让大家更直观地理解红包金额的生成过程。