本文目錄一覽:
- 1、隨機紅包金額如何決定的
- 2、怎麼樣通過微信隨機生成紅包金額算法php版
- 3、微信紅包的隨機算法是怎樣的?
- 4、微信紅包的隨機算法是怎樣實現的?
- 5、微信紅包的隨機算法是怎樣實現的
- 6、php之紅包發放規則
隨機紅包金額如何決定的
從工程角度來說,紅包分配算法需要簡單粗暴的實現。
有些人的算法過於複雜,第幾個人領取都要面面俱到的計算,考慮因素太多,工程實現上真的沒必要。
其實只需要按照如下框架即可:
1. 發紅包時,按照設計的快速隨機算法,將紅包分好若干份。
2. 按照設計的評估算法,對得到的紅包分配進行校驗。
3. 如果校驗不通過,如貧富差距過大,則重複隨機分配。
4. 如果若干次重複,如5次,則停止重複,就按照當前分配。
5. 再有用戶請求紅包,直接隊列化請求,再從紅包序列中取出對應編號紅包。
上述方案的優勢是:
1. 只需「一次」計算。
隨機算法選擇簡單粗暴的即可,系統按照校驗策略對其評價,不滿足則有限次重複,直到滿足或次數太多為止。
2. 此後就只有讀取。
後續操作完全是讀取緩存,無需密集計算。
那麼是不是還有更簡單粗暴的方案呢?還是有的,那就是偽隨機序列查表法。
百萬千萬級別的紅包請求,如果每次都按照真隨機來計算,仍然會有不小的計算壓力。
索性預先計算得到若干偽隨機分配方案,調用時只需要隨機選擇一個即可。
舉例來說,有人的紅包是10元分配給5人,系統預先存有多種分配方案,如1,1,2,3,3,或1,1,2,2,4,請求時隨機選取一個方案即可。
當然,各種組合未必能窮盡,但是只需要讓用戶在有限次操作中覺得這是隨機就夠了。
擴展資料
微信紅包是騰訊旗下產品微信於2014年1月27日推出的一款應用,功能上可以實現發「紅包」、查收發記錄和提現。
2014年4月14日,「安卓手機用戶只要用微信掃描身邊出現的紅色二維碼,通過騰訊應用寶成功安裝其他應用軟件,即可領取微信紅包。
2019年2月10日,微信官方發佈2019年春節數據報告,除夕到初五,8.23億人次收發微信紅包。
設計簡單
在「微信紅包」這個功能的設計上,遵循了簡單的原則。發送方通過「新年紅包」公眾號,選擇發送紅包的數量和金額,以及祝福的話語,通過「微信支付」進行支付,就可以發送給好友;接收方則在打開後獲得相應收益,只需要將儲蓄卡與微信關聯,就可以在一個工作日後提現。2014年1月27日前,用戶在搶紅包之前,要先寫上祝福,然後才可以搶。在這之後,已經改為先搶紅包再發送祝福的過程。
怎麼樣通過微信隨機生成紅包金額算法php版
php 有個函數叫 rand() 產生隨機數,你去看看手冊上的這個函數吧。
微信紅包的隨機算法是怎樣的?
1)紅包大小服從截尾正態分佈,其好處是減少抽取紅包大小分佈的方差,讓更多的人抽取的紅包在均值附近,同時仍給一小部分人抽取大紅包的機會,總體來說增加了紅包抽取人的積極性和遊戲的公平性;
2)抽取紅包大小與抽取紅包先後無相關性。一種可能的紅包產生機制是:當發紅包者準備紅包的時候,程序自動依照截尾分佈產生了相應大小,相應個數的紅包,然後隨機發給抽取紅包的人。同樣,這樣的一個隨機過程有助於增加遊戲的公平性,也減少了紅包抽取人投機操作。
錢包錢數滿足截尾正態隨機數分佈。大致為在截尾正態分佈中取隨機數,並用其求和數除以總價值,獲得修正因子,再用修正因子乘上所有的隨機數,得到紅包價值。
這種分佈意味着:低於平均值的紅包多,但是離平均值不遠;高於平均值的紅包少,但是遠大於平均值的紅包
微信紅包的隨機算法是怎樣實現的?
我們在一個20人的群中,自己發紅包以及結合其他人發出紅包的情況,整合成兩輪的數據。每次金額設置都是20塊並且有20個,第一輪是發了15次,第二輪是發了19次,總結成表格,然後為了避免突發的數據影響判斷,我們將兩輪數據雜糅從而生成了其他的三輪數據,一共是五輪數據。羅列如下表,高亮的數據為最佳手氣。每一列的數據最早搶到紅包的在最底端,越往上越晚搶。
從所有黃色的數值(最佳手氣金額)可看出,所有最佳手氣值都在平均值*2的前後附近(平均值=總金額/紅包總個數,這裡平均值=20/20=1),事實上確實如此,可通過微信紅包分發算法得到驗證,算法具體見後文
然後我們選取部分數據開始製作散點圖。橫軸為1-20,分別表示搶到紅包的人的編號,隨遞增而越早。也就是20代表最早搶到的人。縱軸為金額。同樣的形狀顏色的點代表一次發紅包,然後我們抓取部分數據顯示為散點圖,越密集代表該順序位的用戶得到的金額越穩定。散點圖如下:
規律一:我們可以看到,所有紅包大多數金額分佈在0.5到1.5元之間,顯示為圖中方框所示,大部分點都分佈在這個位置。然後是順序位密集程度的對比,可以發現20、19,也就是最先搶到紅包的人,小圓圈所示基本的點都集中在小範圍,說明先搶紅包的人得到的金額會比較穩定,但同時最佳手氣的概率也比較低。大圓圈所示的是極不穩定,飄忽的金額分佈,表示越晚搶紅包得到的金額會飄忽不穩,但同時,搶到最佳手氣等大金額的紅包概率也比早搶的高。
根據上面的分析,我們又寫了一個過濾計數函數,針對金額的分段的紅包個數進行統計:
比如2.0-2.5
得到如下金額分佈:
折線圖:
規律二:絕大多數的紅包的金額都集中在1-1.5,也就是說20塊錢發20個紅包的金額分佈集中在比平均數大一點點的附近,同時較大幅超過平均數金額的紅包大大少於低于于平均數的紅包數量。
那我們繼續擴大數據的規模,將幾輪數據的均值和標準差分別做成折線圖:
綜合上面各個折線圖的情況,我們可以得到越早搶紅包的標準差越小,越晚搶紅包的標準差越大,但同時,由均值和總額可以看出來,越早搶紅包的均值往往要更高,紅包金額得到最佳手氣概率也會相對較小,越晚搶紅包的人則得到最佳手氣等大手氣的概率更大。
為了得到更為趨近規律的曲線和規律,我們決定將兩輪真實數據合併起來,然後給出冪函數的趨近線(虛線),如下圖:
由於均值受極值波動影響較大,所以我們去除一些因為偶然差產生的極端點(圓圈的點)從而發現是遞增的趨勢。
規律三:可以很明顯的看到,均值是隨着搶紅包的越晚而緩慢遞減,標準差值同時也往上遞增,這個趨勢結合之前的分析,我們猜想,即標準差越大說明,領取到最大的紅包和最小紅包的風險越大,也就是說越晚搶標準差越大,對於冒險主義者來講是最好的,因為他有很大概率獲得最大的金額,但也大概率獲得最小的紅包,風險與收益並存;均值越大,說明每次都拿到一個不大不小的紅包,雖然獲得最小和最大金額紅包的概率很小,但起碼不虧本,也就是說越早搶,均值越穩定,這比較適合不喜歡冒險的人。
驗證預測結果:
21:24分 發送預測結果到另一位同學微信:
隨後開始發紅包:
結果:
最佳手氣為第8個人且金額為1.13
與預測結果一致,規律基本正確!
總結:
(1)最佳手氣為1.13塊,根據我們推導的預測公式=總額/紅包總個數*2*隨機數(0-2的double數), 也就是說最佳手氣在總額/紅包總個數*2值的前後附近。這裡我們判斷在0.8-1.3之間,推斷正確
(2)平均值為0.5元,0.5-0.8元的紅包有3個,小於0.5的紅包有6個,說明大於平均值的紅包個數多於小於平均值的個數。與我們的第二點預測完全正確
(3)最佳手氣位置:根據我們的散點圖發現,最先搶到紅包的人,得到的金額會比較穩定,但同時最佳手氣的概率也比較低。表示越晚搶紅包得到的金額波動較大,但同時搶到最佳手氣等大金額的紅包概率也比早搶的高。所以我們推斷,最佳手氣位置在最後20%-30%之間。
微信紅包隨機分發算法c++模擬:
基本思路:每次搶到一個紅包金額等於:紅包剩餘金額/紅包剩餘個數*2*隨機數(0-1的double型),如果計算的結果小於等於0.01,則取0.01值
主要代碼:
double packages[50000];
double Luckiest_money=0;
void getPackage(int remainSize,double remainMoney){
srand((unsigned)time(NULL));
for(int i=0;i
微信紅包的隨機算法是怎樣實現的
比如100元,由10個人分,那麼平均一個人是10元錢。然後付款後,系統開始分份兒。
第一份:系統由0~10元之間隨機一個數,作為這一份的錢數,設x1。
第二份:剩下的錢(100-x1),系統由0~(100-x1)/(10-1)隨機一個數,作為這份的錢數,設x2
.。。。
第n份:剩下的錢(100-x1-x2-…-xn),系統由0~(100-x1-x2-…-xn-1)/(10-n)隨機一個數,作為這個份的錢數,設為xn
當用戶進來拿紅包的時候,系統由0~9之間隨機一個數,隨機到幾,就取第幾份紅包,然後將這個數存到list里。當之後的用戶抽到相同的隨機數時,則將這個數+1,如遇相同再+1,直至list滿,紅包發完。
php之紅包發放規則
使用PHP發紅包,當我們輸入紅包數量和總金額後,PHP會根據這兩個值進行隨機分配每個金額,保證每個人都能領取到一個紅包,每個紅包金額不等,就是要求紅包金額要有差異,所有紅包金額總額應該等於總金額。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/249239.html