成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

別人在搶紅包,程序員在研究紅包算法

原創
移動開發 Android 算法
拋開微信紅包的市場價值不談,紅包本身的算法也引發了熱議,由于官方沒有給出明確的說法,各家也是眾說紛紜,小編下面也為大家帶來幾種分析。

微信紅包在羊年春節的火爆程度不言而喻,廣告主投入5億現金紅包,與央視羊年春晚獨家合作起到了巨大的推動作用。這就像一針大補丸,在短時間內給微信帶來了極大的關注度與流量。除夕全天微信用戶紅包總發送量達到10.1億次,搖一搖互動量達到110億次,紅包峰值發送量為8.1億次/分鐘。

拋開微信紅包的市場價值不談,紅包本身的算法也引發了熱議,由于官方沒有給出明確的說法,各家也是眾說紛紜,小編下面也為大家帶來幾種分析。

首先看看數據分析帝

大多數人都做出自己的猜測,這也是在不知道內部隨機算法的時候的唯一選擇,但是大多數人沒有給出自己親自的調查結果。這里給出一份100樣本的調查抽樣樣本數據,并提出自己的猜測。

1. 錢包錢數滿足截尾正態隨機數分布。大致為在截尾正態分布中取隨機數,并用其求和數除以總價值,獲得修正因子,再用修正因子乘上所有的隨機數,得到紅包價值。

這種分布意味著:低于平均值的紅包多,但是離平均值不遠;高于平均值的紅包少,但是遠大于平均值的紅包偏多。

圖1. 錢包價值與其頻率分布直方圖及其正態擬合

但看分布直方圖并不能推出它符合正態分布,但是考慮到程序的簡潔性和隨機數的合理性,這是最合乎情理的一種猜測。

 越是后面的錢包,價值普遍更高

圖2. 錢包序列數與其價值關系曲線

從圖2中的線性擬合紅線可以看到,錢包價值的總體變化趨勢是在慢慢增大,其變化范圍大約是一個綠色虛線上下界劃出的“通道”。(曲線可以被圍在這么一個正合乎常規的“通道”中,也從側面反映了規律1的合理性,說明了并不是均勻分布的隨機數)

從另一個平均數的圖中也可以看出這一規律。

圖3. 平均數隨序列數的變化曲線

在樣本中,1000價值的錢包被分成100份,均值為10。然而在圖3中我們可以看到在***一個錢包之前,平均數一直低于10,這就說明了一開始的錢包價值偏低,一直被后期的錢包價值拉著往上走,后期的錢包價值更高。

3. 當然平均數的圖還可以透露出另一個規律,那就是***的那一個人往往容易走運抽得比較多。因為***那一個人是錢包剩下多少就拿多少的,而之前所有人的平均數 都低于10,所以至少保證了***一個人會高于平均值。在本樣本中,98號錢包抽到35,而***一份錢包抽到46。

綜上,根據樣本猜測:

1. 抽到的錢大多數時候跟別人一樣少,但一旦一多,就容易多很多。

2. 越是抽后面的錢包,錢越容易多。

3. ***一個人往往容易撞大運。

點評:這種明顯很實際有差異,小編每次不管什么時候搶都是幾毛錢。

第二位同學寫了一個簡單python 代碼

據觀察,紅包分錢滿足以下幾點:

1.不會有人拿不到錢

2.不會提前分完

3.錢的波動范圍很大

紅包在一開始創建的時候,分配方案就訂好了。搶紅包的時候,不過是挨個pop up而已。

因此 python 代碼如下:

  1. def weixin_divide_hongbao(money, n): 
  2. divide_table = [random.randint(110000for x in xrange(0, n)] 
  3. sum_ = sum(divide_table) 
  4. return [x*money/sum_ for x in divide_table] 

不過上述算法還有兩個小問題:

1.浮點數精度問題

2.邊界值的處理

第三位同學按照網上流傳的python寫了一個java的版本

  1. int j=1
  2. while(j<1000
  3. int number=10
  4. float total=100
  5. float money; 
  6. double min=0.01
  7. double max; 
  8. int i=1
  9.  
  10. List math=new ArrayList(); 
  11. while(i<number) 
  12.  
  13. max = total- min*(number- i); 
  14. int k = (int)((number-i)/2); 
  15. if (number -i <= 2
  16. {k = number -i;} 
  17. max = max/k; 
  18. money=(int)(min*100+Math.random()*(max*100-min*100+1)); 
  19. money=(float)money/100
  20. total=total-money; 
  21. math.add(money); 
  22. System.out.println("第"+i+"個人拿到"+money+"剩下"+total); 
  23. i++; 
  24. if(i==number) 
  25. math.add(total); 
  26. System.out.println("第"+i+"個人拿到"+total+"剩下0"); 
  27.  
  28. System.out.println("本輪發紅包中第"+(math.indexOf(Collections.max(math))+1)+"個人手氣***"); 
  29. j++; 

第四位同學的這種算法看起來非常科學。

他認為:

1、每個人都要能夠領取到紅包;

2、每個人領取到的紅包金額總和=總金額;

3、每個人領取到的紅包金額不等,但也不能差的太離譜,不然就沒趣味;

4、算法一定要簡單,不然對不起騰訊這個招牌;

正式編碼之前,先搭建一個遞進的模型來分析規律

設定總金額為10元,有N個人隨機領取:

N=1

則紅包金額=X元;

N=2

為保證第二個紅包可以正常發出,***個紅包金額=0.01至9.99之間的某個隨機數

第二個紅包=10-***個紅包金額;

N=3

紅包1=0.01至0.98之間的某個隨機數

紅包2=0.01至(10-紅包1-0.01)的某個隨機數

紅包3=10-紅包1-紅包2

……

  1. header("Content-Type: text/html;charset=utf-8");//輸出不亂碼,你懂的 
  2. $total=10;//紅包總額 
  3. $num=8;// 分成8個紅包,支持8人隨機領取 
  4. $min=0.01;//每個人最少能收到0.01元 
  5.  
  6. for ($i=1;$i<$num;$i++) 
  7.     $safe_total=$total-($num-$i)*$min;//隨機安全上限 
  8.     $money=mt_rand($min*100,$safe_total*100)/100; 
  9.     $total=$total-$money; 
  10.     echo '第'.$i.'個紅包:'.$money.' 元,余額:'.$total.' 元 <br/>'; 
  11. echo '第'.$num.'個紅包:'.$total.' 元,余額:0 元'; 

輸入一看,波動太大,這數據太無趣了!

第1個紅包:7.48 元,余額:2.52 元

第2個紅包:1.9 元,余額:0.62 元

第3個紅包:0.49 元,余額:0.13 元

第4個紅包:0.04 元,余額:0.09 元

第5個紅包:0.03 元,余額:0.06 元

第6個紅包:0.03 元,余額:0.03 元

第7個紅包:0.01 元,余額:0.02 元

第8個紅包:0.02 元,余額:0 元

改良一下,將平均值作為隨機安全上限來控制波動差

  1. header("Content-Type: text/html;charset=utf-8");//輸出不亂碼,你懂的 
  2. $total=10;//紅包總額 
  3. $num=8;// 分成8個紅包,支持8人隨機領取 
  4. $min=0.01;//每個人最少能收到0.01元 
  5.  
  6. for ($i=1;$i<$num;$i++) 
  7.     $safe_total=($total-($num-$i)*$min)/($num-$i);//隨機安全上限 
  8.     $money=mt_rand($min*100,$safe_total*100)/100
  9.     $total=$total-$money; 
  10.     echo '第'.$i.'個紅包:'.$money.' 元,余額:'.$total.' 元 <br/>'
  11. echo '第'.$num.'個紅包:'.$total.' 元,余額:0 元'

輸出結果見下圖

第1個紅包:0.06 元,余額:9.94 元

第2個紅包:1.55 元,余額:8.39 元

第3個紅包:0.25 元,余額:8.14 元

第4個紅包:0.98 元,余額:7.16 元

第5個紅包:1.88 元,余額:5.28 元

第6個紅包:1.92 元,余額:3.36 元

第7個紅包:2.98 元,余額:0.38 元

第8個紅包:0.38 元,余額:0 元

小結:

小編覺得這完全可以理解成一個紅包引發的血案,小編僅僅列舉了幾個,還有一些工程學的同學直接拋出了數學模型、離散函數等等,但是無論算法是簡單還是復雜,玩的開心就夠了。

責任編輯:chenqingxiang 來源: 知乎整理
相關推薦

2015-02-26 14:45:42

微信支付寶紅包

2024-08-19 11:31:41

2017-01-20 11:14:37

紅包

2019-08-29 09:57:24

Python系統編程

2016-03-02 14:01:53

2021-11-16 23:11:24

Java微信搶紅包

2015-02-27 09:45:25

搶紅包手機

2016-12-27 09:49:59

支付寶紅包破解

2015-02-26 13:34:28

2015-09-02 10:33:54

紅包類型optionals

2014-11-13 17:48:21

2015-02-28 21:10:35

4G斐訊C530搶紅包

2015-02-26 13:43:18

微信支付寶紅包

2015-12-31 11:30:10

趨勢科技/信息安全

2021-02-09 07:35:16

手機QQ紅包APP

2018-06-04 12:41:50

程序員貪心算法分析

2020-09-01 07:47:32

Redis秒殺微信

2017-01-06 13:54:08

CTO訓練營搞笑

2018-01-31 14:11:31

微信紅包隨機
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美视频三区 | 欧美日韩综合精品 | 国产精品日本一区二区在线播放 | 有码一区| 国产精品久久 | 国产精品久久久久婷婷二区次 | 精品久久久久久亚洲精品 | 国产自产21区 | 成人国产一区二区三区精品麻豆 | 天天操网 | 日本精品久久久久 | 亚洲综合色自拍一区 | 久久亚洲一区 | 国产精品日韩欧美一区二区三区 | 欧美一卡二卡在线观看 | 日韩在线国产精品 | 亚洲国产一区二区三区 | 中文字幕第九页 | 精品国产一区二区三区久久久久久 | 欧美精品一区二区三区在线 | 91精品国产一区二区在线观看 | 一区二区三区久久久 | 一级毛片免费 | 91精品国产一区二区三区 | 91在线看视频 | 一区二区av| 国产一区二区三区免费视频 | 国产精品久久久久久久久污网站 | 国产精品久久久久久久久久三级 | 成人亚洲网 | 成人在线免费av | 亚洲精品亚洲人成人网 | 免费精品视频在线观看 | 国产精品日韩欧美一区二区 | 99精品久久 | 久久久久综合 | 美女视频一区 | 日韩视频福利 | wwwxxx日本在线观看 | 日韩精品在线观看一区二区三区 | 中文字幕av一区二区三区 |