JAVA实现抽奖大转盘摇一摇核心算法 亲测实用
生活随笔
收集整理的這篇文章主要介紹了
JAVA实现抽奖大转盘摇一摇核心算法 亲测实用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
公司最近市場活動需求頻繁更新 什么抽獎活動 大轉盤? 搖一搖 各種活動 活動類型各種各樣但是都是通過概率去算出來是否中將廢話不多說 新手上路 大神勿噴
實體類
public class AnniversaryPrizePool {//序號private int index;//中獎概率private BigDecimal winningProbability;//獎品Idprivate Integer prizeId;//獎品名稱private String giftName;public int getIndex() {return index;}public void setIndex(int index) {this.index = index;}public BigDecimal getWinningProbability() {return winningProbability;}public void setWinningProbability(BigDecimal winningProbability) {this.winningProbability = winningProbability;}public Integer getPrizeId() {return prizeId;}public void setPrizeId(Integer prizeId) {this.prizeId = prizeId;}public String getGiftName() {return giftName;}public void setGiftName(String giftName) {this.giftName = giftName;}public AnniversaryPrizePool(int index, BigDecimal winningProbability, Integer prizeId, String giftName) {this.index = index;this.winningProbability = winningProbability;this.prizeId = prizeId;this.giftName = giftName;}@Overridepublic String toString() {return "AnniversaryPrizePool{" +"index=" + index +", winningProbability=" + winningProbability +", prizeId=" + prizeId +", giftName='" + giftName + '\'' +'}';}核心算法
/*** 抽獎* @param anniversaryPrizePools 原始的概率列表,保證順序和實際物品對應* @return 物品的索引*/public static int lottery(List<AnniversaryPrizePool> anniversaryPrizePools) {//擴大倍數int mulriple = 100;BigDecimal now = BigDecimal.ZERO;for (AnniversaryPrizePool anniversaryPrizePool : anniversaryPrizePools) {//所有概率加起來now = now.add(anniversaryPrizePool.getWinningProbability());}//概率乘以倍數mulriple = now.multiply(new BigDecimal(mulriple)).intValue();int lastScope = 0;// 洗牌,打亂獎品次序Collections.shuffle(anniversaryPrizePools);Map<Integer, int[]> prizeScopes = new HashMap<Integer, int[]>();for (AnniversaryPrizePool anniversaryPrizePool : anniversaryPrizePools) {int prizeId = anniversaryPrizePool.getPrizeId();// 劃分區間int currentScope = lastScope + anniversaryPrizePool.getWinningProbability().multiply((new BigDecimal(mulriple).divide(now,0,BigDecimal.ROUND_HALF_UP))).intValue();prizeScopes.put(prizeId, new int[] { lastScope + 1, currentScope });lastScope = currentScope;}//獲得隨機的概率int luckyNumber = new Random().nextInt(mulriple);int luckyPrizeId = 0;// 查找隨機數所在的區間if ((null != prizeScopes) && !prizeScopes.isEmpty()) {Set<Map.Entry<Integer, int[]>> entrySets = prizeScopes.entrySet();for (Map.Entry<Integer, int[]> m : entrySets) {int key = m.getKey();if (luckyNumber >= m.getValue()[0] && luckyNumber <= m.getValue()[1]) {luckyPrizeId = key;break;}}}return luckyPrizeId;}算法實現
?首先把所有的商品中間的概率相加然后擴大多少倍我這里是擴大一百倍 擴大倍數可以根據自己的需求去擴大 然后打亂次序
然后獲取隨機數劃分區間
看測試
public static void main(String[] args) {List<AnniversaryPrizePool> anniversaryPrizePoolsList = new ArrayList<AnniversaryPrizePool>();anniversaryPrizePoolsList.add(new AnniversaryPrizePool(1, new BigDecimal(0.4), 1, "再來一次"));anniversaryPrizePoolsList.add(new AnniversaryPrizePool(2, new BigDecimal(0.3), 3, "本站VIP一年"));anniversaryPrizePoolsList.add(new AnniversaryPrizePool(3, new BigDecimal(0.5), 0, "謝謝參與"));anniversaryPrizePoolsList.add(new AnniversaryPrizePool(4, new BigDecimal(0.2), 5, "50金幣"));anniversaryPrizePoolsList.add(new AnniversaryPrizePool(5, new BigDecimal(0.1), 6, "Iphone 6"));anniversaryPrizePoolsList.add(new AnniversaryPrizePool(6, new BigDecimal(0), 7, "Ipad Air2"));anniversaryPrizePoolsList.add(new AnniversaryPrizePool(7, new BigDecimal(0), 8, "100元手機話費"));double num = 100;int index = 0;int indexs = 0;for (int i = 0; i < num; i++) {int lottery = LotteryUtil.lottery(anniversaryPrizePoolsList);index = index + 1;}System.out.println("第" + index + "抽獎");System.out.println("謝謝參與次數為:"+indexs);}所謂概率不是百分百精準 也就是說眾生平等 這里這概率設置為0的就怎么抽都抽不到
既然說到了概率不會是百分百精準 在實際場景中我們的商品還有一個庫存的概念也就是說你中獎了但是庫存不足也會是謝謝參與
?
總結
以上是生活随笔為你收集整理的JAVA实现抽奖大转盘摇一摇核心算法 亲测实用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用MarkdownPad 2添加图片
- 下一篇: 偏相关系数 - sas 实现