PHP隨機紅包演算法

2022-03-13 12:45:56 字數 1652 閱讀 7116

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 第二個 為保證第二個紅包...