Java抽獎算法第二例
本文實例為大家分享了java抽獎算法,供大家參考,具體內(nèi)容如下
1. 算法分析
根據(jù)概率將獎品劃分區(qū)間,每個區(qū)間代表一個獎品,然后抽取隨機數(shù),反查落在那個區(qū)間上,即為所抽取的獎品。
2.代碼
核心算法
public class Arithmetic { // 放大倍數(shù) private static final int mulriple = 1000000; public int pay(List<Prize> prizes) { int lastScope = 0; // 洗牌,打亂獎品次序 Collections.shuffle(prizes); Map<Integer, int[]> prizeScopes = new HashMap<Integer, int[]>(); Map<Integer, Integer> prizeQuantity = new HashMap<Integer, Integer>(); for (Prize prize : prizes) { int prizeId = prize.getPrizeId(); // 劃分區(qū)間 int currentScope = lastScope + prize.getProbability().multiply(new BigDecimal(mulriple)).intValue(); prizeScopes.put(prizeId, new int[] { lastScope + 1, currentScope }); prizeQuantity.put(prizeId, prize.getQuantity()); lastScope = currentScope; } // 獲取1-1000000之間的一個隨機數(shù) int luckyNumber = new Random().nextInt(mulriple); int luckyPrizeId = 0; // 查找隨機數(shù)所在的區(qū)間 if ((null != prizeScopes) && !prizeScopes.isEmpty()) { Set<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] && prizeQuantity.get(key) > 0) { luckyPrizeId = key; break; } } } if (luckyPrizeId > 0) { // 獎品庫存減一 } return luckyPrizeId; } }
Prize bean
public class Prize { /** * 獎品唯一標示 */ private Integer prizeId; /** * 中獎概率 */ private BigDecimal probability; /** * 獎品數(shù)量 */ private Integer quantity; public Integer getPrizeId() { return prizeId; } public void setPrizeId(Integer prizeId) { this.prizeId = prizeId; } public BigDecimal getProbability() { return probability; } public void setProbability(BigDecimal probability) { this.probability = probability; } public Integer getQuantity() { return quantity; } public void setQuantity(Integer quantity) { this.quantity = quantity; } }
3.測試
prize1概率: 5%
prize2概率: 10%
prize3概率: 15%
prize4概率: 20%
prize5概率: 50%
public class Test { public static void main(String[] args) { List<Prize> prizes = new ArrayList<Prize>(); Prize prize1 = new Prize(); prize1.setPrizeId(1); prize1.setProbability(new BigDecimal(0.05)); prize1.setQuantity(1); prizes.add(prize1); Prize prize2 = new Prize(); prize2.setPrizeId(2); prize2.setProbability(new BigDecimal(0.10)); prize2.setQuantity(10); prizes.add(prize2); Prize prize3 = new Prize(); prize3.setPrizeId(3); prize3.setProbability(new BigDecimal(0.15)); prize3.setQuantity(20); prizes.add(prize3); Prize prize4 = new Prize(); prize4.setPrizeId(4); prize4.setProbability(new BigDecimal(0.20)); prize4.setQuantity(50); prizes.add(prize4); Prize prize5 = new Prize(); prize5.setPrizeId(5); prize5.setProbability(new BigDecimal(0.50)); prize5.setQuantity(200); prizes.add(prize5); int prize1GetTimes = 0; int prize2GetTimes = 0; int prize3GetTimes = 0; int prize4GetTimes = 0; int prize5GetTimes = 0; Arithmetic arithmetic = new Arithmetic(); int times = 1000; for (int i = 0; i < times; i++) { int prizeId = arithmetic.pay(prizes); switch (prizeId) { case 1: prize1GetTimes++; break; case 2: prize2GetTimes++; break; case 3: prize3GetTimes++; break; case 4: prize4GetTimes++; break; case 5: prize5GetTimes++; break; } } System.out.println("抽獎次數(shù)" + times); System.out.println("prize1中獎次數(shù)" + prize1GetTimes); System.out.println("prize2中獎次數(shù)" + prize2GetTimes); System.out.println("prize3中獎次數(shù)" + prize3GetTimes); System.out.println("prize4中獎次數(shù)" + prize4GetTimes); System.out.println("prize5中獎次數(shù)" + prize5GetTimes); } }
結(jié)果:
通過1000次抽取,我們看出算法精度還是很高的。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
IDEA生成可運行jar包(包含第三方j(luò)ar包)流程詳解
這篇文章主要介紹了IDEA生成可運行jar包(包含第三方j(luò)ar包)流程詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-11-11SpringBoot實現(xiàn)接口統(tǒng)一前綴
本文主要介紹了SpringBoot實現(xiàn)接口統(tǒng)一前綴,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07springboot整合mybatis中的問題及出現(xiàn)的一些問題小結(jié)
這篇文章主要介紹了springboot整合mybatis中的問題及出現(xiàn)的一些問題小結(jié),本文給出了解決方案,需要的朋友可以參考下2018-11-11springboot實現(xiàn)公眾號接收回復(fù)消息和超過5秒被動回復(fù)消息
本文主要介紹了springboot實現(xiàn)公眾號接收回復(fù)消息和超過5秒被動回復(fù)消息,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-05-05