利用java實現(xiàn)中獎概率詳情
1. 算法分析
根據(jù)概率將獎品劃分區(qū)間,每個區(qū)間代表一個獎品,然后抽取 隨機(jī)數(shù),反查落在那個區(qū)間上,即為所抽取的獎品。
2. 代碼核心算法
import com.alibaba.fastjson.JSONObject; import java.math.BigDecimal; import java.util.*; //抽獎核心算法 public class Arithmetic { // 放大倍數(shù) private static final int mulriple = 1000000; public static int pay(List<Prize> prizes) { int lastScope = 0; // 洗牌,打亂獎品次序 Collections.shuffle(prizes); Map prizeScopes = new HashMap(); Map prizeQuantity = new HashMap(); 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之間的一個隨機(jī)數(shù) int luckyNumber = new Random().nextInt(mulriple); int luckyPrizeId = 0; // 查找隨機(jī)數(shù)所在的區(qū)間 if ((null != prizeScopes) && !prizeScopes.isEmpty()) { Set set = prizeScopes.entrySet(); for (Object o : set) { Map.Entry m = (Map.Entry) o; int key = (int) m.getKey(); Object value = m.getValue(); Integer[] val = JSONObject.parseObject(JSONObject.toJSONString(value), Integer[].class); if (luckyNumber >= val[0] && luckyNumber <=val[1] && Integer.parseInt(prizeQuantity.get(key)+"") > 0) { luckyPrizeId = key; break; } } } // if (luckyPrizeId > 0) { // // 獎品庫存減一 // } return luckyPrizeId; } public static void main(String[] args) { List<Prize> prizes = new ArrayList(); Prize prize1 = new Prize(); prize1.setPrizeId(10000); prize1.setProbability(new BigDecimal(0.01)); prize1.setQuantity(1); prizes.add(prize1); Prize prize2 = new Prize(); prize2.setPrizeId(10001); prize2.setProbability(new BigDecimal(0.19)); prize2.setQuantity(10); prizes.add(prize2); Prize prize3 = new Prize(); prize3.setPrizeId(10); prize3.setProbability(new BigDecimal(0.8)); prize3.setQuantity(1); prizes.add(prize3); int times = 1000; int prize1GetTimes = 0; int prize2GetTimes = 0; int prize3GetTimes = 0; for (int i = 0; i < times; i++) { int pay = pay(prizes); System.out.println("抽獎到了"+pay); switch (pay) { case 10000: prize1GetTimes++; break; case 10001: prize2GetTimes++; break; case 10: prize3GetTimes++; break; } } System.out.println("抽獎次數(shù)" + times); System.out.println("prize1中獎次數(shù)" + prize1GetTimes); System.out.println("prize2中獎次數(shù)" + prize2GetTimes); System.out.println("prize3中獎次數(shù)" + prize3GetTimes); } }
3. 抽獎對象
import lombok.Data; import java.math.BigDecimal; @Data public class Prize { //獎品唯一標(biāo)示 private Integer prizeId; //中獎概率 private BigDecimal probability; //獎品數(shù)量 private Integer quantity; }
執(zhí)行結(jié)果如下:
通過1000次抽取,我們看出算法精度還是很高的。
到此這篇關(guān)于利用java實現(xiàn)中獎概率詳情的文章就介紹到這了,更多相關(guān)java中獎概率內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Springboot+netty實現(xiàn)Web聊天室
這篇文章主要介紹了利用springboot+netty實現(xiàn)一個簡單Web聊天室,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)Java的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-12-12SpringBoot實現(xiàn)多個ApplicationRunner時部分接口未執(zhí)行問題
這篇文章主要介紹了SpringBoot實現(xiàn)多個ApplicationRunner時部分接口未執(zhí)行問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-05-05SpringBoot Actuator監(jiān)控的項目實踐
本文主要結(jié)合 Spring Boot Actuator,跟大家一起分享微服務(wù)Spring Boot Actuator 的常見用法,方便我們在日常中對我們的微服務(wù)進(jìn)行監(jiān)控治理,感興趣的可以了解一下2024-01-01通過Java來測試JSON和Protocol Buffer的傳輸文件大小
這篇文章主要介紹了通過Java來測試JSON和Protocol Buffer的傳輸文件大小,Protocol Buffer(文中簡稱Protobuffer)是谷歌開發(fā)的新的文件傳輸格式,需要的朋友可以參考下2015-12-12