根據實際需求整理的抽獎算法邏輯
需求說明
- 獎品多數爲虛擬商品,只設置比例,不設置數量
- 獎品需要精準發放,舉例:假如只有兩個獎品,比例爲1:9,那麼10個人抽獎一定要1個人中獎品1,9個人中獎品2
算法邏輯
注: 獎池相當於一個隊列
- 計算各個獎品的比例 例如 獎品1:獎品2:獎品3:獎品4 = 1:5:30:64
- 將對應比例的獎品按照份數放入獎池
- 將獎池打亂
- 判斷獎池數量是否達到獎品最小數量,假如未達到,擴大相應倍數。這個步驟的目的是初始化獎池的邏輯比較耗時,並且生成獎池的動作需要加鎖,開銷較大,多生成幾份,以空間獲取時間
缺陷
- 業務上,當參與人數很少時貴重物品可能會被抽走,失去了抽獎活動的意義
解決
將貴重獎品放到後二分之一位置, 這是最騷的
- 貴重物品篩選出來,暫不放入獎池
- 取獎品總數的一半到現獎池末尾隨機一點,切割這一點到獎池末尾形成一個新的獎池
- 將貴重物品放入新獎池
- 將新獎池打亂, 這一步很重要,防止貴重物品在獎池中集中
- 將新獎池加入到舊獎池中
算法缺點
- 當某個獎品的中獎率特別低時,所生成的獎池會非常大,生成獎池期間無法抽獎, 消耗內存