天天看點

微信紅包算法研究

背景:之前過年親戚人都在搶紅包,都想搶第一個,說是越早搶越大。其實這肯定是不正确的,微信在你發紅包的時候應該已經生成所有的紅包了,是以說你無論第幾個搶,按說應該都一樣,除非微信做了一些處理,比如說越早搶紅包越可能手氣最佳,過完年回來上班,突然想起了微信紅包,就在想微信紅包生成的政策。

20塊錢10個紅包,人均2塊錢。因為理論上紅包的金額應該在2塊錢左右,而且越大機率越小,感覺這個很像正态分布函數,是以感覺微信紅包屬于截尾正态分布。手氣最佳一般在2倍-3倍左右。

類似于這種(網上找的圖):

微信紅包算法研究

所有紅包在發送者發紅包的時候都已經生成好了,領紅包隻是領生成的紅包而已,點選别人發的紅包,隻會計算你點選的那一時刻還有沒有紅包,如果沒有了,你就隻能檢視details了,是以說打開的時候出現的那個拆字相當于一個令牌,你可以憑借這個令牌去領紅包,當然這個令牌在領紅包的時候也有可能紅包被領完了,是以你也就回去看details了,如果領到了就會告訴你領了多少錢。

每一次從紅包金額池裡随機出的金額應該是當時剩餘總人數的均值,比如第一個人抽應該基于2的正态分布,如果他抽了4塊錢,那麼随機第二個紅包的時候自然是基于16/9的正态分布,以此往後推,抽到倒數第一個就不用抽了,直接把剩下的都分了就行。而且因為紅包最小是0.01嘛,是以每一次抽獎的時候都得留夠足夠的錢來用于發放剩下的紅包,随意每一次随機都得判斷。而且我做了一個限額倍數,因為随機出來的數字很可能在均值偏下的地方,多個累積起來,很可能就會造成最後一個紅包過大的可能,是以我做了調整,當最後一個紅包大于一定的倍數的時候,需要重新抽。另外,按這樣抽獎,第一個人的均值應該最大,是以我在最後對生成的紅包打亂了順序。

随機生成紅包的代碼,做了一些簡單的封裝。

若y~n(a,b^2) (b>0),則x=(y-a)/b~(0,1)

測試随機數是否符合正态分布

當然,微信紅包肯定不是這麼簡單,也有可能不是基于正态分布,是以為了增加他的可玩性,應該做了很多的處理,比如說在紅包均值很高的時候總有一些人會出現好幾個幾分的,這個估計應該是做了處理的。

繼續閱讀