业务总结003:抽奖活动
生活随笔
收集整理的這篇文章主要介紹了
业务总结003:抽奖活动
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
C 端抽獎 UI 效果:
一、抽獎活動模型
上圖是大概的抽獎活動模型,可能一個抽獎活動會持續很多天,這里活動抽獎規則、獎勵庫存都采用的都是當日的概念,當然也可以采用活動持續時長的概念,具體看產品的意愿,畢竟產品大大說了算。
二、抽獎算法
2.1 隨機概率
在獎勵池隨機一個作為用戶獎勵,這種方式實現起來很簡單,但是產品不允許。為了吸引用戶參與抽獎,一般會設置一些成本較高的獎勵,這些成本較高的獎勵肯定不希望被用戶大概率抽到。
2.2 庫存計算概率
獎勵庫存與中獎概率成正比,在很多場景下根據庫存計算中獎概率也是一種比較好的選擇。普通的獎勵一般在后臺會設置大量的庫存,而成本較高的獎勵可能只會設置個位數的庫存。畢竟項目上線時不是由開發配置抽獎活動,不排除運營人員不清楚規則胡亂配置的可能,導致與預期不符。
2.3 指定中獎概率
用戶能不能中獎嚴格按照后臺各獎勵的中獎概率計算,便于各業務線人員理解。
三、抽獎算法簡單實現
隨機概率比較簡單,一行代碼完事,這里就不說了。重點說下剩下兩種算法的實現方式,實現細節是在”0 - 總庫存“范圍內生成一個隨機數,然后把獎勵庫存分段,分段區間與獎勵一一對應,隨機數落在的那個分段區間對應的獎勵為用戶抽中的獎勵。
下面是根據庫存計算中獎概率的 demo,根據中獎概率計算同理。
public class LotteryDemo {public static Random random = new Random();public static List<LotteryRewardSku> rewardSkuList;static {rewardSkuList = Arrays.asList(new LotteryRewardSku(1L, 10), new LotteryRewardSku(2L, 5), new LotteryRewardSku(3L, 1));}public static void main(String[] args) {Map<Long, Integer> rewardSkuStockMap = rewardSkuList.stream().collect(Collectors.toMap(LotteryRewardSku::getLotteryRewardSkuId, LotteryRewardSku::getStockNum));for (int i = 0; i < 5; i++) {LotteryRewardSku rewardSku = lotteryAlgorithm(rewardSkuList, rewardSkuStockMap);System.out.println(rewardSku.getLotteryRewardSkuId());}}private static LotteryRewardSku lotteryAlgorithm(List<LotteryRewardSku> rewardSkuList, Map<Long, Integer> rewardSkuStockMap) {int totalStock = (int) rewardSkuStockMap.values().stream().collect(Collectors.summarizingInt(i -> i)).getSum();// 在庫存總數中隨機一個數字,作為中獎數int randNum = random.nextInt(totalStock) + 1;int next = 0;Long getRewardSkuId = null;// 庫存分段for (Map.Entry<Long, Integer> awardEntry : rewardSkuStockMap.entrySet()) {if (randNum <= next + awardEntry.getValue()) {getRewardSkuId = awardEntry.getKey();break;}next += awardEntry.getValue();}Long finalGetRewardSkuId = getRewardSkuId;return rewardSkuList.stream().filter(sku -> sku.getLotteryRewardSkuId().equals(finalGetRewardSkuId)).findFirst().orElse(null);}@Data@AllArgsConstructorpublic static class LotteryRewardSku {private Long lotteryRewardSkuId;private Integer stockNum;} }總結
以上是生活随笔為你收集整理的业务总结003:抽奖活动的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring IoC 源码系列(一)Be
- 下一篇: 天使轮的股份上限 不宜超过30%