摘要:獲取隨機(jī)紅包獲取最大值和最小值的距離之間的最小值獲取到之間的隨機(jī)數(shù)與距離最小值相乘得出浮動(dòng)區(qū)間,這使得浮動(dòng)區(qū)間不會(huì)超出范圍這個(gè)算法的原理其實(shí)就是根據(jù)剩余不斷變化的平均值去加減隨機(jī)數(shù)做到不超過(guò)總額,但紅包的分布就沒(méi)那么平均。
產(chǎn)品經(jīng)理 : 老司機(jī),你那邊開(kāi)發(fā)個(gè)領(lǐng)取紅包的版塊。我給一定的金額總數(shù),紅包個(gè)數(shù),最高發(fā)放金額,以及最低發(fā)放金額,你要隨機(jī)生成固定個(gè)數(shù)的紅包,紅包總額不能超過(guò)金額總數(shù)。
老司機(jī) : 你(筆者),去實(shí)現(xiàn)這個(gè)算法,把生成的紅包全部丟到數(shù)據(jù)庫(kù)里面。
好吧,就這樣,這個(gè)需求就讓我實(shí)現(xiàn)了。其實(shí)業(yè)務(wù)看起來(lái)說(shuō)的很復(fù)雜,其實(shí)就是例如我有1000元,我想發(fā)放100個(gè)紅包,最高不能超過(guò)20塊,最低不能低于1塊。
當(dāng)時(shí)我也不太清楚這個(gè)算法要怎么寫,上網(wǎng)搜索了下,找到一種比較合理的算法,是用微積分去實(shí)現(xiàn)(我會(huì)把代碼貼出來(lái))的。算法原理如下
(原文地址:http://blog.csdn.net/cleverco...)
我剛開(kāi)始覺(jué)得這個(gè)算法確實(shí)很不錯(cuò),但仔細(xì)看了下里面的源碼后覺(jué)得會(huì)比較耗性能,而且回頭一看公司的需求,其實(shí)也就個(gè)紅包生成(在項(xiàng)目經(jīng)理沒(méi)要求需要正態(tài)分布的情況下),沒(méi)必要把復(fù)雜簡(jiǎn)單的東西弄復(fù)雜了。所以我思來(lái)想去想了一個(gè)晚上,終于寫出了個(gè)比較合理的算法。
/* * 獲取隨機(jī)紅包 * min= money-(n-1)max */ function getRedPackage($money, $num, $min, $max) { $data = array(); if ($min * $num > $money) { return array(); } if($max*$num < $money){ return array(); } while ($num >= 1) { $num--; $kmix = max($min, $money - $num * $max); $kmax = min($max, $money - $num * $min); $kAvg = $money / ($num + 1); //獲取最大值和最小值的距離之間的最小值 $kDis = min($kAvg - $kmix, $kmax - $kAvg); //獲取0到1之間的隨機(jī)數(shù)與距離最小值相乘得出浮動(dòng)區(qū)間,這使得浮動(dòng)區(qū)間不會(huì)超出范圍 $r = ((float)(rand(1, 10000) / 10000) - 0.5) * $kDis * 2; $k = round($kAvg + $r); $money -= $k; $data[] = $k; } return $data; }
這個(gè)算法的原理其實(shí)就是根據(jù)剩余不斷變化的平均值去加減隨機(jī)數(shù)做到不超過(guò)總額,但紅包的分布就沒(méi)那么平均。
差不多有三個(gè)月沒(méi)寫文章了,主要是這三個(gè)月一直在學(xué)習(xí)新的東西,相關(guān)php的工具,workman,kafka,以及golang。學(xué)的東西很雜,但也做出了效果,每天都在公司躲到11點(diǎn)后才回家。筆者也建議phper新人們,不要單純限制在php語(yǔ)言里面,以及去討論php是否是最好的編程語(yǔ)言之類的。畢竟能解決問(wèn)題的武器就是好武器,一個(gè)工程師被公司聘請(qǐng)來(lái)就是解決問(wèn)題的(大聲喊出來(lái),我們不是碼農(nóng))。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/23267.html
算法為自創(chuàng),非微信官方算法(僅供參考);如測(cè)出有問(wèn)題,請(qǐng)及時(shí)反饋。感謝 原文:http://flc.ren/2018/04/701.html CHANGELOG 2018-04-07 修復(fù)最后一個(gè)紅包輸出未保留2位數(shù) 修復(fù)領(lǐng)取的紅包金額低于最小紅包限制
摘要:擴(kuò)展兼容全局變量適用于高并發(fā)搶購(gòu)秒殺,紅包生成,數(shù)組算法處理等由于添加了二維碼生成功能,安裝本擴(kuò)展之前需要安裝,安裝方法如下兼容如果沒(méi)有安裝和,也需要安裝安裝方法如下致力于做工具類,其他的正在開(kāi)發(fā)中第一個(gè)參數(shù)是紅包總額,第二個(gè)人 php擴(kuò)展zqf (兼容php7) 全局變量適用于高并發(fā)搶購(gòu)、秒殺,紅包生成,數(shù)組算法處理等,由于添加了二維碼生成功能,安裝本擴(kuò)展之前需要安裝libqrenc...
摘要:記錄下整體的設(shè)計(jì)思路以及運(yùn)營(yíng)過(guò)程中的各種問(wèn)題。如果錢是負(fù)數(shù)了,還得從已生成的小紅包中抽取回來(lái)將紅包放入隊(duì)列之中創(chuàng)建紅包失敗,請(qǐng)檢查參數(shù)生產(chǎn)和之間的隨機(jī)數(shù),但是概率不是平均的,從到方向概率逐漸加大。 公司前段時(shí)間根據(jù)業(yè)務(wù)方需求需要做一個(gè)搶紅包的活動(dòng),網(wǎng)上也搜索了很多資料。記錄下整體的設(shè)計(jì)思路以及運(yùn)營(yíng)過(guò)程中的各種問(wèn)題。 產(chǎn)品需求: 1.紅包支持配置開(kāi)始時(shí)間、結(jié)束時(shí)間、類型(隨機(jī)金額或固定金...
摘要:記錄下整體的設(shè)計(jì)思路以及運(yùn)營(yíng)過(guò)程中的各種問(wèn)題。如果錢是負(fù)數(shù)了,還得從已生成的小紅包中抽取回來(lái)將紅包放入隊(duì)列之中創(chuàng)建紅包失敗,請(qǐng)檢查參數(shù)生產(chǎn)和之間的隨機(jī)數(shù),但是概率不是平均的,從到方向概率逐漸加大。 公司前段時(shí)間根據(jù)業(yè)務(wù)方需求需要做一個(gè)搶紅包的活動(dòng),網(wǎng)上也搜索了很多資料。記錄下整體的設(shè)計(jì)思路以及運(yùn)營(yíng)過(guò)程中的各種問(wèn)題。 產(chǎn)品需求: 1.紅包支持配置開(kāi)始時(shí)間、結(jié)束時(shí)間、類型(隨機(jī)金額或固定金...
摘要:記錄下整體的設(shè)計(jì)思路以及運(yùn)營(yíng)過(guò)程中的各種問(wèn)題。如果錢是負(fù)數(shù)了,還得從已生成的小紅包中抽取回來(lái)將紅包放入隊(duì)列之中創(chuàng)建紅包失敗,請(qǐng)檢查參數(shù)生產(chǎn)和之間的隨機(jī)數(shù),但是概率不是平均的,從到方向概率逐漸加大。 公司前段時(shí)間根據(jù)業(yè)務(wù)方需求需要做一個(gè)搶紅包的活動(dòng),網(wǎng)上也搜索了很多資料。記錄下整體的設(shè)計(jì)思路以及運(yùn)營(yíng)過(guò)程中的各種問(wèn)題。 產(chǎn)品需求: 1.紅包支持配置開(kāi)始時(shí)間、結(jié)束時(shí)間、類型(隨機(jī)金額或固定金...
閱讀 2479·2021-09-29 09:34
閱讀 3316·2021-09-23 11:21
閱讀 2508·2021-09-06 15:00
閱讀 1134·2019-08-30 15:44
閱讀 2037·2019-08-29 17:23
閱讀 3008·2019-08-29 16:44
閱讀 3064·2019-08-29 13:13
閱讀 1943·2019-08-28 18:12