分享

破解红包算法!为啥“手气最佳”总是别人?

 谁用了我的名字 2022-02-03

审核专家:郑远攀

郑州轻工业大学教授

每到过年,就是一波红包雨来临的时刻,想一想是不是有些小激动呢?

然而同样是一个红包,为啥别人总是“手气最佳”,而你却只能分到一毛、五毛……

手机抢红包真的公平吗?

打开红包的瞬间,你的手机里发生了什么?

抢红包背后藏着哪些不为人知的科学原理?

其实,抢红包背后的算法严密而复杂,既要保证公平,又要充满趣味性,还要考虑现实中的种种意外情况。

无论是微信还是其他支付平台,红包的算法都属于商业机密的范畴,我们无法得知它背后的原理。

虽说是机密,但总归逃不过一些基本的算法,真正的红包分配算法也是在一些基本而简单的算法上不断改进而来的。

下面就让小编带大家盘点几种可能实现红包功能的算法吧~

图片

拼“手速”的红包

刚拿到这个问题时,可能有人会想:既然红包的总金额和人数都是提前设定好的,那么我只要在每个人点击“拆开红包的瞬间”随机地分配给他一定金额不就可以了吗?

要注意的无非是,这个金额不能大于总金额,也不能少于一分钱,直到所有钱被抢完为止。

这个看似简单而完美的红包分配方法其实暗藏着一个巨大的Bug——越先打开红包的人,可能获得的金额越大。为什么会这样呢?

虽然每一个人在抢红包时都是随机分配数额的,貌似很公平,但总会有“先来后到”。

我们假设有一个100元的红包。第一个人可以在0.01元到100元之间,随机地分配到一定金额。如果我们把第一个人抽到的所有可能的金额都计算在内,并取个平均值,那么他平均能获得50元。

这50元在数学上还有个形象的名字,叫做数学期望。既然是“期望”,就总会有落空的时候,也不排除会有意外的惊喜。因此,第一个人抽到的金额可能不足50元,也可能大于50元。

假设第一个人抢到23元,那么红包内就只剩下77元了,即便第二个人运气再好,最多也只能抢到非常接近77元的一个数值(假如后面还有人要抢红包的话)。比起第一个人可能获得的最高钱数(非常接近100元)更少。

如果用前面提到的“数学期望”的方法来计算的话,这时第二个人平均下来只能获得38.5元,这显然是不公平的。

随着抢红包的进行,越晚抢红包的人,红包里所剩的总金额就越少,平均下来可能获得的收益就越小,本应该“意外重重”“精彩刺激”的抢红包游戏最终变成了“手速大比拼”与“网速大比拼”。

图片

不过,这种方法是有改进的空间的,那就是在第一个人打开红包之前预先把金额都分配好并随机地打乱顺序。

这就相当于,发红包的人在付款成功之后,由手机自动地产生了指定数量的模拟人,并让它们按照这种随机分配金额的方法依次把红包里的钱抢光。根据前面所讲,先抢到红包的模拟人平均获得的钱比后抢到红包的模拟人多。

这时,我们把这些“模拟人”的先后顺序随机地打乱。当真正的人点开红包时,再由这些“模拟人”按照打乱之后的次序依次地将各自抢到的钱交给真正的操作手机的自然人。这样,通过预先分配和打乱顺序的方法,我们就成功解决了金额越抢越少的问题。

图片

“雨露均沾”的红包

为了提高抢红包的公平性,还有人提出了另一种红包算法,叫做“二倍均值法”。

小伙伴们可不要被这个高端的名字吓到,这种方法的原理很简单,就是把每个人可能抽到的最高金额强行降低。即便你是第一个打开红包的人,也不允许你任意地从0.01到100元之间抽取金额。

那么,该如何规定每个人可能抽到的最高金额呢?

假设红包总金额100元,20个人去抢,如果完全平均分配的话,每个人能分配到5元。将这个数乘2就是第一个人最多被允许抽到的最大金额,即10元。这也是“二倍平均”这个名字的由来。

用这种方法,第一个人只能在0.01到10元之间随机抽取到一定金额,平均下来他抽到金额的数学期望是5元。假设他运气不好抽到4元,那么轮到第二个人打开红包时,还剩下96元。

同样地,我们假设把96元平均分给19个人,平均每个人大约能分到5元5分钱,再将这个数乘2就是第二个人可能抢到的最大金额,10元1角,他只能在0.01到10.10元之间随机地抽取一定金额,他能抽到的所有金额的平均值约为5.05元。

如果第二人手气超不错,抢抽到了6元,那么第三个人可能获得的金额在0.01到10元之间,数学期望是5元。

以此类推,我们发现,无论你是第一个打开红包的人还是第19个打开红包的人,能获得的最高金额都是差不多的,平均下来你可能收获的钱数也是差不多的,大大提高了抢红包的公平性。

那么这样的红包算法就是最好的吗?

要知道,这种“雨露均沾”的红包在具有了很强公平性的同时,也牺牲掉了许多惊喜。

一旦我们知道红包的金额与人数之后,就能大致估计我们的收益是多少,即便是今日“手气王”,他所能得到的钱,也不会超过预先计算好的上限。

图片

那么,怎么才能让抢红包的过程既公平又刺激呢?看看下面的方法吧~

图片

“剪绳子”的启示

刚刚我们做了许多数字上的“游戏”,现在让我们抛开数字,到生活中看看。

100除了能代表100元钱,还可以有许多含义,比如100米的绳子。

于是,我们不妨用100米的绳子来代表100元钱,如果有20个人抢红包的话,就在绳子上随性地剪上19刀,将它分成长短完全随机的20份,每个人再随机地领一份走,绳子越长就代表金额越多。

图片

刚才的几种情况如果类比到剪绳子问题上会是怎样的情形呢?

第一种随机分配金额的方法,就好比拿着一把剪子,从左往右依次随机地剪19刀,每剪下一段就直接分给一个人。

改进的随机分配方法,则是在依次剪下每段绳子后先不发给大家,而是将最后剪成的二十段绳子放进一个黑箱子里再摇匀,让领取的人像抓阄一样从箱子里抽取。

而“二倍均值法”依然是从左到右依次剪开绳子,边剪边分发给大家。只不过剪开每段的最大长度受到了严格的限制。

经过这样的类比,小伙伴们有没有想到新的分配方法呢?

如果我们打破“从左到右依次剪开”的规则,而是在这100米的绳子上随意地剪19刀,之后再依次把这20段绳子分配给每个人的话会是怎样的情形呢?

图片

来源丨作者自制

由于不受左右顺序的影响,每段绳子的长度都不受限制,保留了抢红包的惊喜。此外,由于需要把这19刀随机地剪完之后再进行分配,因此打开红包的先后顺序不会影响金额的多少,保证了公平性,可谓两全其美。

小伙伴们有没有觉得这种类比的思维方式很有趣呢?它不仅让我们换一个角度了解了抢红包的原理,同时还为新方法的发现提供了全新的思路。

其实,微信红包真正的运作原理要比我们介绍的几种方法复杂得多,其中涉及到了一些很容易忽视却对结果影响很大的细节。

比如人民币最小金额是0.01元,如何让随机产生的红包金额不少于0.01元呢?会不会出现前几个运气“爆表”的人分走了红包里绝大多数金额,以至后面的人连平均0.01元也分不到的情况呢?

像这样的细节问题其实还有很多,我们现在使用的微信红包分配算法也不见得就是最完美的。随着版本的更新与算法的升级,红包分配算法的逻辑也在一点点地被完善。

来源:数字北京科学中心

由科普中国重新排版编辑
内容来自:数字北京科学中心

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多