麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 學(xué)院 > 邏輯算法 > 正文

大家在搶紅包,程序員在研究紅包算法

2020-03-22 20:03:59
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
除夕全天微信用戶紅包總發(fā)送量達(dá)到10.1億次,搖一搖互動(dòng)量達(dá)到110億次,紅包峰值發(fā)送量為8.1億次/分鐘。拋開(kāi)微信紅包的市場(chǎng)價(jià)值不談,紅包本身的算法也引發(fā)了熱議,由于官方?jīng)]有給出明確的說(shuō)法,各家也是眾說(shuō)紛紜,小編下面也為大家?guī)?lái)幾種分析。首先看看數(shù)據(jù)分析帝大多數(shù)人都做出自己的猜測(cè),這也是在不知道內(nèi)部隨機(jī)算法的時(shí)候的唯一選擇,但是大多數(shù)人沒(méi)有給出自己親自的調(diào)查結(jié)果。這里給出一份100樣本的調(diào)查抽樣樣本數(shù)據(jù),并提出自己的猜測(cè)。
1. 錢包錢數(shù)滿足截尾正態(tài)隨機(jī)數(shù)分布。大致為在截尾正態(tài)分布中取隨機(jī)數(shù),并用其求和數(shù)除以總價(jià)值,獲得修正因子,再用修正因子乘上所有的隨機(jī)數(shù),得到紅包價(jià)值。這種分布意味著:低于平均值的紅包多,但是離平均值不遠(yuǎn);高于平均值的紅包少,但是遠(yuǎn)大于平均值的紅包偏多。
圖1. 錢包價(jià)值與其頻率分布直方圖及其正態(tài)擬合
但看分布直方圖并不能推出它符合正態(tài)分布,但是考慮到程序的簡(jiǎn)潔性和隨機(jī)數(shù)的合理性,這是最合乎情理的一種猜測(cè)。
越是后面的錢包,價(jià)值普遍更高

圖2. 錢包序列數(shù)與其價(jià)值關(guān)系曲線從圖2中的線性擬合紅線可以看到,錢包價(jià)值的總體變化趨勢(shì)是在慢慢增大,其變化范圍大約是一個(gè)綠色虛線上下界劃出的“通道”。(曲線可以被圍在這么一個(gè)正合乎常規(guī)的“通道”中,也從側(cè)面反映了規(guī)律1的合理性,說(shuō)明了并不是均勻分布的隨機(jī)數(shù))
從另一個(gè)平均數(shù)的圖中也可以看出這一規(guī)律。

圖3. 平均數(shù)隨序列數(shù)的變化曲線在樣本中,1000價(jià)值的錢包被分成100份,均值為10。然而在圖3中我們可以看到在最后一個(gè)錢包之前,平均數(shù)一直低于10,這就說(shuō)明了一開(kāi)始的錢包價(jià)值偏低,一直被后期的錢包價(jià)值拉著往上走,后期的錢包價(jià)值更高。3. 當(dāng)然平均數(shù)的圖還可以透露出另一個(gè)規(guī)律,那就是最后的那一個(gè)人往往容易走運(yùn)抽得比較多。因?yàn)樽詈竽且粋€(gè)人是錢包剩下多少就拿多少的,而之前所有人的平均數(shù) 都低于10,所以至少保證了最后一個(gè)人會(huì)高于平均值。在本樣本中,98號(hào)錢包抽到35,而最后一份錢包抽到46。綜上,根據(jù)樣本猜測(cè):

1. 抽到的錢大多數(shù)時(shí)候跟別人一樣少,但一旦一多,就容易多很多。
2. 越是抽后面的錢包,錢越容易多。
3. 最后一個(gè)人往往容易撞大運(yùn)。點(diǎn)評(píng):這種明顯很實(shí)際有差異,小編每次不管什么時(shí)候搶都是幾毛錢。
第二位同學(xué)寫(xiě)了一個(gè)簡(jiǎn)單python 代碼
據(jù)觀察,紅包分錢滿足以下幾點(diǎn):1.不會(huì)有人拿不到錢
2.不會(huì)提前分完
3.錢的波動(dòng)范圍很大
紅包在一開(kāi)始創(chuàng)建的時(shí)候,分配方案就訂好了。搶紅包的時(shí)候,不過(guò)是挨個(gè)pop up而已。
因此 python 代碼如下:def weixin_divide_hongbao(money, n): divide_table = [random.randint(1, 10000)for x in xrange(0, n)] sum_ = sum(divide_table) return [x*money/sum_ for x in divide_table] 不過(guò)上述算法還有兩個(gè)小問(wèn)題:1.浮點(diǎn)數(shù)精度問(wèn)題
2.邊界值的處理第三位同學(xué)按照網(wǎng)上流傳的python寫(xiě)了一個(gè)java的版本int j=1; while(j 1000) int number=10; float total=100; float money; double min=0.01; double max; int i=1; List math=new ArrayList(); while(i number) max = total- min*(number- i); int k = (int)((number-i)/2); if (number -i = 2) {k = number -i;} max = max/k; money=(int)(min*100+Math.random()*(max*100-min*100+1)); money=(float)money/100; total=total-money; math.add(money); System.out.println("第"+i+"個(gè)人拿到"+money+"剩下"+total); i++; if(i==number) math.add(total); System.out.println("第"+i+"個(gè)人拿到"+total+"剩下0"); System.out.println("本輪發(fā)紅包中第"+(math.indexOf(Collections.max(math))+1)+"個(gè)人手氣最佳"); j++; }第四位同學(xué)的這種算法看起來(lái)非常科學(xué)。
他認(rèn)為:
1、每個(gè)人都要能夠領(lǐng)取到紅包;
2、每個(gè)人領(lǐng)取到的紅包金額總和=總金額;
3、每個(gè)人領(lǐng)取到的紅包金額不等,但也不能差的太離譜,不然就沒(méi)趣味;
4、算法一定要簡(jiǎn)單,不然對(duì)不起騰訊這個(gè)招牌;
正式編碼之前,先搭建一個(gè)遞進(jìn)的模型來(lái)分析規(guī)律
設(shè)定總金額為10元,有N個(gè)人隨機(jī)領(lǐng)取:
N=1
則紅包金額=X元;
N=2
為保證第二個(gè)紅包可以正常發(fā)出,第一個(gè)紅包金額=0.01至9.99之間的某個(gè)隨機(jī)數(shù)
第二個(gè)紅包=10-第一個(gè)紅包金額;
N=3
紅包1=0.01至0.98之間的某個(gè)隨機(jī)數(shù)
紅包2=0.01至(10-紅包1-0.01)的某個(gè)隨機(jī)數(shù)
紅包3=10-紅包1-紅包2
……
int j=1; while(j 1000) int number=10; float total=100; float money; double min=0.01; double max; int i=1; List math=new ArrayList(); while(i number) max = total- min*(number- i); int k = (int)((number-i)/2); if (number -i = 2) {k = number -i;} max = max/k; money=(int)(min*100+Math.random()*(max*100-min*100+1)); money=(float)money/100; total=total-money; math.add(money); System.out.println("第"+i+"個(gè)人拿到"+money+"剩下"+total); i++; if(i==number) math.add(total); System.out.println("第"+i+"個(gè)人拿到"+total+"剩下0"); System.out.println("本輪發(fā)紅包中第"+(math.indexOf(Collections.max(math))+1)+"個(gè)人手氣最佳"); j++; } 輸入一看,波動(dòng)太大,這數(shù)據(jù)太無(wú)趣了!
第1個(gè)紅包:7.48 元,余額:2.52 元
第2個(gè)紅包:1.9 元,余額:0.62 元
第3個(gè)紅包:0.49 元,余額:0.13 元
第4個(gè)紅包:0.04 元,余額:0.09 元
第5個(gè)紅包:0.03 元,余額:0.06 元
第6個(gè)紅包:0.03 元,余額:0.03 元
第7個(gè)紅包:0.01 元,余額:0.02 元
第8個(gè)紅包:0.02 元,余額:0 元
改良一下,將平均值作為隨機(jī)安全上限來(lái)控制波動(dòng)差
int j=1; while(j 1000) int number=10; float total=100; float money; double min=0.01; double max; int i=1; List math=new ArrayList(); while(i number) max = total- min*(number- i); int k = (int)((number-i)/2); if (number -i = 2) {k = number -i;} max = max/k; money=(int)(min*100+Math.random()*(max*100-min*100+1)); money=(float)money/100; total=total-money; math.add(money); System.out.println("第"+i+"個(gè)人拿到"+money+"剩下"+total); i++; if(i==number) math.add(total); System.out.println("第"+i+"個(gè)人拿到"+total+"剩下0"); System.out.println("本輪發(fā)紅包中第"+(math.indexOf(Collections.max(math))+1)+"個(gè)人手氣最佳"); j++; }輸出結(jié)果見(jiàn)下圖第1個(gè)紅包:0.06 元,余額:9.94 元
第2個(gè)紅包:1.55 元,余額:8.39 元
第3個(gè)紅包:0.25 元,余額:8.14 元
第4個(gè)紅包:0.98 元,余額:7.16 元
第5個(gè)紅包:1.88 元,余額:5.28 元第6個(gè)紅包:1.92 元,余額:3.36 元
第7個(gè)紅包:2.98 元,余額:0.38 元
第8個(gè)紅包:0.38 元,余額:0 元
小結(jié):
小編覺(jué)得這完全可以理解成一個(gè)紅包引發(fā)的血案,小編僅僅列舉了幾個(gè),還有一些工程學(xué)的同學(xué)直接拋出了數(shù)學(xué)模型、離散函數(shù)等等,但是無(wú)論算法是簡(jiǎn)單還是復(fù)雜,玩的開(kāi)心就夠了。PHP教程

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 91青青| 亚洲小视频在线 | 成人综合在线观看 | 性 毛片 | 九九热在线视频观看 | 56av国产精品久久久久久久 | 毛片网站视频 | 97porn| 性片免费看 | 2017亚洲男人天堂 | 国产毛片在线 | 午夜偷拍视频 | 亚洲免费资源 | 国产成人av免费观看 | 黄色一级片在线观看 | 国产91在线亚洲 | 国产精品剧情一区二区在线观看 | 看91视频| 久久九九热re6这里有精品 | 日韩毛片一区二区三区 | h视频在线观看免费 | 欧美日韩精品不卡一区二区三区 | 日韩999| 国产一区二区三区黄 | 色婷婷久久久久久 | 毛片视频网址 | 狠狠干精品视频 | 亚洲欧洲日韩av | 依人在线视频 | 欧美一区在线观看视频 | 精品一区二区久久久久 | 免费黄网站在线播放 | 免费一级在线观看 | 男男羞羞视频网站国产 | 99亚洲国产精品 | 毛片在线免费播放 | 久久久精品视频免费看 | 久久久www成人免费精品 | 亚洲免费视频大全 | 久久精品23| 中文字幕精品在线视频 |