破解紅包算法!為啥“手氣最佳”總是別人?
審核專家:鄭遠攀
鄭州輕工業(yè)大學教授
明天就是除夕,又是一波紅包雨即將來臨,想一想是不是有些小激動呢?
然而同樣是一個紅包,為啥別人總是“手氣最佳”,而你卻只能分到一毛、五毛……
手機搶紅包真的公平嗎?
打開紅包的瞬間,你的手機里發(fā)生了什么?
搶紅包背后藏著哪些不為人知的科學原理?

其實,搶紅包背后的算法嚴密而復雜,既要保證公平,又要充滿趣味性,還要考慮現(xiàn)實中的種種意外情況。
無論是微信還是其他支付平臺,紅包的算法都屬于商業(yè)機密的范疇,我們無法得知它背后的原理。
雖說是機密,但總歸逃不過一些基本的算法,真正的紅包分配算法也是在一些基本而簡單的算法上不斷改進而來的。
下面就讓小編帶大家盤點幾種可能實現(xiàn)紅包功能的算法吧~
拼“手速”的紅包
剛拿到這個問題時,可能有人會想:既然紅包的總金額和人數(shù)都是提前設(shè)定好的,那么我只要在每個人點擊“拆開紅包的瞬間”隨機地分配給他一定金額不就可以了嗎?
要注意的無非是,這個金額不能大于總金額,也不能少于一分錢,直到所有錢被搶完為止。
這個看似簡單而完美的紅包分配方法其實暗藏著一個巨大的Bug——越先打開紅包的人,可能獲得的金額越大。為什么會這樣呢?

雖然每一個人在搶紅包時都是隨機分配數(shù)額的,貌似很公平,但總會有“先來后到”。
我們假設(shè)有一個100元的紅包。第一個人可以在0.01元到100元之間,隨機地分配到一定金額。如果我們把第一個人抽到的所有可能的金額都計算在內(nèi),并取個平均值,那么他平均能獲得50元。
這50元在數(shù)學上還有個形象的名字,叫做數(shù)學期望。既然是“期望”,就總會有落空的時候,也不排除會有意外的驚喜。因此,第一個人抽到的金額可能不足50元,也可能大于50元。
假設(shè)第一個人搶到23元,那么紅包內(nèi)就只剩下77元了,即便第二個人運氣再好,最多也只能搶到非常接近77元的一個數(shù)值(假如后面還有人要搶紅包的話)。比起第一個人可能獲得的最高錢數(shù)(非常接近100元)更少。
如果用前面提到的“數(shù)學期望”的方法來計算的話,這時第二個人平均下來只能獲得38.5元,這顯然是不公平的。
隨著搶紅包的進行,越晚搶紅包的人,紅包里所剩的總金額就越少,平均下來可能獲得的收益就越小,本應該“意外重重”“精彩刺激”的搶紅包游戲最終變成了“手速大比拼”與“網(wǎng)速大比拼”。

不過,這種方法是有改進的空間的,那就是在第一個人打開紅包之前預先把金額都分配好并隨機地打亂順序。
這就相當于,發(fā)紅包的人在付款成功之后,由手機自動地產(chǎn)生了指定數(shù)量的模擬人,并讓它們按照這種隨機分配金額的方法依次把紅包里的錢搶光。根據(jù)前面所講,先搶到紅包的模擬人平均獲得的錢比后搶到紅包的模擬人多。
這時,我們把這些“模擬人”的先后順序隨機地打亂。當真正的人點開紅包時,再由這些“模擬人”按照打亂之后的次序依次地將各自搶到的錢交給真正的操作手機的自然人。這樣,通過預先分配和打亂順序的方法,我們就成功解決了金額越搶越少的問題。
“雨露均沾”的紅包
為了提高搶紅包的公平性,還有人提出了另一種紅包算法,叫做“二倍均值法”。
小伙伴們可不要被這個高端的名字嚇到,這種方法的原理很簡單,就是把每個人可能抽到的最高金額強行降低。即便你是第一個打開紅包的人,也不允許你任意地從0.01到100元之間抽取金額。

那么,該如何規(guī)定每個人可能抽到的最高金額呢?
假設(shè)紅包總金額100元,20個人去搶,如果完全平均分配的話,每個人能分配到5元。將這個數(shù)乘2就是第一個人最多被允許抽到的最大金額,即10元。這也是“二倍平均”這個名字的由來。
用這種方法,第一個人只能在0.01到10元之間隨機抽取到一定金額,平均下來他抽到金額的數(shù)學期望是5元。假設(shè)他運氣不好抽到4元,那么輪到第二個人打開紅包時,還剩下96元。
同樣地,我們假設(shè)把96元平均分給19個人,平均每個人大約能分到5元5分錢,再將這個數(shù)乘2就是第二個人可能搶到的最大金額,10元1角,他只能在0.01到10.10元之間隨機地抽取一定金額,他能抽到的所有金額的平均值約為5.05元。
如果第二人手氣超不錯,搶抽到了6元,那么第三個人可能獲得的金額在0.01到10元之間,數(shù)學期望是5元。
以此類推,我們發(fā)現(xiàn),無論你是第一個打開紅包的人還是第19個打開紅包的人,能獲得的最高金額都是差不多的,平均下來你可能收獲的錢數(shù)也是差不多的,大大提高了搶紅包的公平性。
那么這樣的紅包算法就是最好的嗎?
要知道,這種“雨露均沾”的紅包在具有了很強公平性的同時,也犧牲掉了許多驚喜。
一旦我們知道紅包的金額與人數(shù)之后,就能大致估計我們的收益是多少,即便是今日“手氣王”,他所能得到的錢,也不會超過預先計算好的上限。

那么,怎么才能讓搶紅包的過程既公平又刺激呢?看看下面的方法吧~
“剪繩子”的啟示
剛剛我們做了許多數(shù)字上的“游戲”,現(xiàn)在讓我們拋開數(shù)字,到生活中看看。
100除了能代表100元錢,還可以有許多含義,比如100米的繩子。
于是,我們不妨用100米的繩子來代表100元錢,如果有20個人搶紅包的話,就在繩子上隨性地剪上19刀,將它分成長短完全隨機的20份,每個人再隨機地領(lǐng)一份走,繩子越長就代表金額越多。

剛才的幾種情況如果類比到剪繩子問題上會是怎樣的情形呢?
第一種隨機分配金額的方法,就好比拿著一把剪子,從左往右依次隨機地剪19刀,每剪下一段就直接分給一個人。
改進的隨機分配方法,則是在依次剪下每段繩子后先不發(fā)給大家,而是將最后剪成的二十段繩子放進一個黑箱子里再搖勻,讓領(lǐng)取的人像抓鬮一樣從箱子里抽取。
而“二倍均值法”依然是從左到右依次剪開繩子,邊剪邊分發(fā)給大家。只不過剪開每段的最大長度受到了嚴格的限制。
經(jīng)過這樣的類比,小伙伴們有沒有想到新的分配方法呢?
如果我們打破“從左到右依次剪開”的規(guī)則,而是在這100米的繩子上隨意地剪19刀,之后再依次把這20段繩子分配給每個人的話會是怎樣的情形呢?

由于不受左右順序的影響,每段繩子的長度都不受限制,保留了搶紅包的驚喜。此外,由于需要把這19刀隨機地剪完之后再進行分配,因此打開紅包的先后順序不會影響金額的多少,保證了公平性,可謂兩全其美。
小伙伴們有沒有覺得這種類比的思維方式很有趣呢?它不僅讓我們換一個角度了解了搶紅包的原理,同時還為新方法的發(fā)現(xiàn)提供了全新的思路。

其實,微信紅包真正的運作原理要比我們介紹的幾種方法復雜得多,其中涉及到了一些很容易忽視卻對結(jié)果影響很大的細節(jié)。
比如人民幣最小金額是0.01元,如何讓隨機產(chǎn)生的紅包金額不少于0.01元呢?會不會出現(xiàn)前幾個運氣“爆表”的人分走了紅包里絕大多數(shù)金額,以至后面的人連平均0.01元也分不到的情況呢?
像這樣的細節(jié)問題其實還有很多,我們現(xiàn)在使用的微信紅包分配算法也不見得就是最完美的。隨著版本的更新與算法的升級,紅包分配算法的邏輯也在一點點地被完善。