2023年1月14日 14:19:14 星期六
一, 整體設計
演算法有很多種, 可以自行選擇, 主要的"架構" 是這樣的, 用redis decr()命令去限流, 用mysql去記錄各種需要的資料
二, 紅包演算法
簡便起見, 紅包金額用整數表示, 假設每個紅包裡邊有x個糖豆, 每個人最少乙個豆
一種: 每個紅包的最大金額是: (剩餘金額/剩餘紅包數)*2, 需要開始的時候預先分配給每個人乙個豆
1多次統計function randbean($total_bean, $total_packet)2
19}2021
$list = $total_bean;//
剩餘的金豆作為最後乙個紅包
2223
//合併
24foreach ($list
as$k => $v
) 27
28return
$list
;29 }
第二種, 對其簡單擴充套件一下, 每個紅包的最大金額是: (剩餘金額/剩餘紅包數)*3; 但是要求每次最少發2個紅包
第三種, 線段法, 隨機生成幾個數字, 將乙個直線分成幾段, 每段的長度(這個波動比較大, 不是很平均, 如果限制了每個紅包的大小, 會比較麻煩)
1第四種:function abc ($total_bean, $total_packet)2
1213
$list[0] = 0; //
第乙個14
$list[$total_bean] = $total_bean; //
最後乙個
1516
sort($list); //
不再保留索引
1718
$beans =;
19for ($j=1; $j
<=$total_packet; $j++)
2223
//return $beans;
24echo ''; print_r($beans); echo
array_sum($beans
);25}26
27 abc(100000, 3);
因為每人最少1個豆, 那麼每次隨機生成豆數的時候要預留 剩餘人數*1個豆;
去掉這些必須剩餘的豆數後, 以剩下的豆數的平均值為最大值進行隨機生成本次豆數
btw:
搶紅包時用redis的一些原子性函式去限流, 然後用mysql去記錄資料
redis配合搶紅包使用的函式(乙個函式可以幹兩件事):
限制每個人只能搶一次
getset(): 設定值並返回原來的值
setnx(): 如果不存在才設定
紅包數量有限, 不能搶超
incr() incrby() : 增加並返回增加後的值
decr() decrby(): 減少並返回減少後的值
紅包有效期
expire, settimeout, pexpire(毫秒)
expireat, pexpireat(毫秒)
微信紅包的隨機演算法
演算法 很簡單 基於截尾正態分佈,數額隨機,額度在0.01和剩餘平均值 2之間。實現上述演算法的邏輯主要是 public static bigdecimal getrandommoney redpackage redpackage random r new random bigdecimal min...
PHP 版 群發紅包演算法
面試中的乙個問題,當時在紙上用偽 描述了下實現的原理.回來後用 實現了下.有不完善或需要改進的地方,歡迎拍磚 fwrite stdout,請輸入紅包金額 money fgets stdin 0 if is numeric money money 0.01 echo 紅包金額為 money n fwr...
PHP實現微信紅包演算法和微信紅包的架構設計簡介
使用php發紅包,當我們輸入紅包數量和總金額後,php會根據這兩個值進行隨機分配每個金額,保證每個人都能領取到乙個紅包,每個紅包金額不等,就是要求紅包金額要有差異,所有紅包金額總額應該等於總金額。設定總金額為10元,有n個人隨機領取 n 1 第乙個 則紅包金額 x元 n 2 第二個 為保證第二個紅包...