麥子學(xué)院
使用javascript如何實(shí)現(xiàn)微信紅包算法?
發(fā)布時(shí)間:2018-05-01 23:16 回復(fù):0 查看:2926 最后回復(fù):2018-05-01 23:16
互聯(lián)網(wǎng)時(shí)代微信紅包、微信支付、支付寶支付成了我們主要的支付手段,今天和大家分享的就是微信紅包算法。我們都知道隨機(jī)紅包,每個(gè)紅包金額是根據(jù)總金額和既定分發(fā)份數(shù)決定的,這其實(shí)就是一個(gè)隨機(jī)函數(shù),那我們用javascript
如何模擬實(shí)現(xiàn)微信搶紅包算法呢?下面本文就圍繞這個(gè)問題和大家分享一二,希望對大家
學(xué)習(xí)javascript有所幫助。
我們假設(shè)有一個(gè)100
元的紅包,要發(fā)給
10
個(gè)人。為了保證公平,算法需要保證以下的原則:
·
每個(gè)人最少能搶到0.01元
·
每個(gè)人的機(jī)會平等
·
所有人的金額之和等于100元
1.
簡單的隨機(jī)函數(shù)實(shí)現(xiàn)
很多朋友的一般思路是:
第一步:從0-100
中隨機(jī)一個(gè)數(shù),得到第一個(gè)紅包金額。
第二步:從0-
剩余金額中隨機(jī)一個(gè)數(shù),得到第二個(gè)紅包金額。
第三步:...
最后一步把剩余的錢都給最后一個(gè)人。
以此類推,得到全部的10
個(gè)紅包。但是不知道大家注意到?jīng)]有,這樣存在明顯的
不公平
。先搶的人比較有優(yōu)勢,第一個(gè)人的隨機(jī)范圍是0-100
,有可能得到較大的金額。而最后一個(gè)人的隨機(jī)范圍就會很小,如果第一個(gè)人搶到了
90
塊錢,那么最后一個(gè)人就不可能有的到超過
10
塊錢的機(jī)會。我們用代碼模擬一下這個(gè)過程:
測試結(jié)果如下:
細(xì)心的朋友會注意到,余額的值不正確,這是JavaScript
浮點(diǎn)數(shù)運(yùn)算的已知問題。
來源:網(wǎng)絡(luò)