審覈專家:鄭遠攀

鄭州輕工業大學教授

春節馬上到,又是一波紅包雨即將來臨,想一想是不是有些小激動呢?

然而同樣是一個紅包,爲啥別人總是“手氣最佳”,而你卻只能分到一毛、五毛……

微信紅包真的公平嗎?

打開紅包的瞬間,你的手機裏發生了什麼?

搶紅包背後藏着哪些不爲人知的科學原理?

來源丨網絡

其實,搶紅包背後的算法嚴密而複雜,既要保證公平,又要充滿趣味性,還要考慮現實中的種種意外情況。

無論是微信還是其他支付平臺,紅包的算法都屬於商業機密的範疇,我們無法得知它背後的原理。

雖說是機密,但總歸逃不過一些基本的算法,真正的紅包分配算法也是在一些基本而簡單的算法上不斷改進而來的。

下面就讓小編帶大家盤點幾種可能實現紅包功能的算法吧~

拼“手速”的紅包

剛拿到這個問題時,可能有人會想:既然紅包的總金額和人數都是提前設定好的,那麼我只要在每個人點擊“拆開紅包的瞬間”隨機地分配給他一定金額不就可以了嗎?

要注意的無非是,這個金額不能大於總金額,也不能少於一分錢,直到所有錢被搶完爲止。

這個看似簡單而完美的紅包分配方法其實暗藏着一個巨大的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元也分不到的情況呢?

像這樣的細節問題其實還有很多,我們現在使用的微信紅包分配算法也不見得就是最完美的。隨着版本的更新與算法的升級,紅包分配算法的邏輯也在一點點地被完善。

相關文章