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