日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

业务总结003:抽奖活动

發布時間:2024/9/30 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 业务总结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:抽奖活动的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。