背景:
做為一名貧困的月光搬磚黨猾瘸,如果想每天加餐能夠多加一塊肉界赔。那么就得靠微信紅包手速搶紅包,所以為了實(shí)現(xiàn)夢(mèng)想牵触。我給自己制定了目標(biāo)淮悼,先搶夠一個(gè)億。
可是這幾天微信紅包手氣揽思,完全都不忍直視呀袜腥。每次都手氣最差,就連自己的發(fā)的紅包自己搶钉汗,也還是搶幾分錢羹令。阿西吧!早餐包子錢都吃不上了损痰。
微信紅包順序拆分猜想
所以當(dāng)我看見隔壁老王正在吃著熱騰騰的包子加豆?jié){,只能默默端起了水杯去飲水機(jī)旁邊打水喝卢未,打算用水安撫我抗議的胃肪凛。
之后一邊靜靜灌水喝,一邊開始思索起來辽社。為什么老王運(yùn)氣好伟墙,總是能夠得到最佳手氣。而我卻總是幾分幾分滴铅,這不科學(xué)戳葵。難得微信紅包有什么奧秘?難得拆分紅包的先后順序會(huì)影響最佳手氣的概率失息?
于是本人趕緊上網(wǎng)搜了搜譬淳,原來早在微信紅包出來的時(shí)候档址。就有人已經(jīng)對(duì)于微信紅包的隨機(jī)分配算法進(jìn)行探討,并給出了相應(yīng)回復(fù)邻梆。(看看大佬們都關(guān)注點(diǎn)總是和我們這些弱渣關(guān)注點(diǎn)不一樣守伸,(ˇ?ˇ) 向大佬們低頭。)
可是很塊我就發(fā)現(xiàn)浦妄,這個(gè)僅供參考的代碼就有一點(diǎn)問題尼摹。根據(jù)圖中的代碼
double min = 0.01;
double max = _leftMoneyPackage.remainMoney / _leftMoneyPackage.remainSize * 2;
通過知乎大神上面的提供的代碼可以看出剂娄,微信發(fā)放的紅包中蠢涝。單個(gè)紅包最小金額為0.01元,而最大金額則為 剩余的金額 / 剩余未拆開紅包的數(shù)量 之后再乘以2
即我發(fā)一個(gè)5毛錢的紅包阅懦,分5人發(fā)送和二。那么其中手氣最佳的最大金額應(yīng)該是 5 / 5 * 2 = 2毛。
對(duì)此我在微信群耳胎,發(fā)了一個(gè)5毛紅包做了測(cè)試:
這里老王在專心吃的他的包子惯吕,因此沒有去搶我發(fā)的紅包∨挛纾可是這樣我還是一樣拿不到手氣最佳废登,心疼我這個(gè)手氣......
嗯額郁惜,不扯遠(yuǎn)了堡距。通過這個(gè)手氣最佳的金額來看 0.34 > 0.5/5 * 2 ,因此從這個(gè)紅包的金額來看兆蕉,現(xiàn)在微信單個(gè)紅包最大金額不滿足知乎提供的公式羽戒。(在當(dāng)時(shí)是不是滿足,我就不清楚了恨樟,畢竟是好幾年的公式了0胱怼)
但是后續(xù)在多個(gè)群里測(cè)試多個(gè)5毛紅包之后,發(fā)現(xiàn)這個(gè)關(guān)于第一個(gè)領(lǐng)紅包劝术、以及最后一個(gè)領(lǐng)紅包先后順序領(lǐng)紅包缩多,獲得手氣最佳的概率是一樣的。
只能說跟歐洲人和非洲人有關(guān)养晋,看來這幾天得多到老王的位置吸吸歐氣 ( ̄_, ̄ )
其他的隨機(jī)算法實(shí)現(xiàn)
在通過慘痛紅包測(cè)試之后衬吆,證明現(xiàn)在當(dāng)初那個(gè)公式可能有誤。但是腫么不能這樣就結(jié)束了绳泉,總得搞點(diǎn)事情出來呀Q仿铡(于是乎,翻閱半天的帖子之后,便回到當(dāng)初知乎題主提問的問題上冒嫡,嘗試解決他的問題拇勃。~(~ ̄▽ ̄)~)
解題:
嘗試了一下,題主的問題孝凌。我好像能夠解決呢7脚亍!
說實(shí)話蟀架,還是覺得題主的這個(gè)隨機(jī)分配想法還是很妙的瓣赂,要是我就想不出來這種隨機(jī)分配金額的辦法來。也要向提問題主低頭(*  ̄︿ ̄)片拍!
function weixin1(money, num) {
var arr1 = [];
var price = 0;
var ha = 0;
var random = 0;
for(var i = 0; i < num; i++) {
if(i == num - 1) {
arr1[i] = parseFloat(money.toFixed(2));
break;
}
arr1[i] = parseInt(parseInt(money / (num - i) * 100) / 100 * (parseInt(Math.random() * 100) / 100) * 100) / 100;
if(!arr1[i]){
arr1[i] = 0.01;
}
money -= arr1[i];
console.log(money);
}
for(var i = 0; i < arr1.length; i++) { //用來檢測(cè)最后的總數(shù)是否正確
price += arr1[i];
}
function randomsort(a, b) {
return Math.random() > 0.5 ? -1 : 1;
}
arr1.sort(randomsort); //數(shù)組重新隨機(jī)排列
console.log(arr1)
console.log(price);
}
weixin1(100, 5);
weixin1(0.5, 5);
以上就是對(duì)微信紅包隨機(jī)分配猜想的胡扯篇煌集,歡迎各位大佬們指導(dǎo)并給出相應(yīng)的意見。(當(dāng)然紅包打賞我就更好了( ̄︶ ̄)捌省,哎呦苫纤!我又想起了我那么多可憐測(cè)試紅包。)