利用java實(shí)現(xiàn)中獎(jiǎng)概率詳情
1. 算法分析
根據(jù)概率將獎(jiǎng)品劃分區(qū)間,每個(gè)區(qū)間代表一個(gè)獎(jiǎng)品,然后抽取 隨機(jī)數(shù),反查落在那個(gè)區(qū)間上,即為所抽取的獎(jiǎng)品。

2. 代碼核心算法
import com.alibaba.fastjson.JSONObject;
import java.math.BigDecimal;
import java.util.*;
//抽獎(jiǎng)核心算法
public class Arithmetic {
// 放大倍數(shù)
private static final int mulriple = 1000000;
public static int pay(List<Prize> prizes) {
int lastScope = 0;
// 洗牌,打亂獎(jiǎng)品次序
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之間的一個(gè)隨機(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) {
// // 獎(jiǎng)品庫(kù)存減一
// }
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("抽獎(jiǎng)到了"+pay);
switch (pay) {
case 10000:
prize1GetTimes++;
break;
case 10001:
prize2GetTimes++;
break;
case 10:
prize3GetTimes++;
break;
}
}
System.out.println("抽獎(jiǎng)次數(shù)" + times);
System.out.println("prize1中獎(jiǎng)次數(shù)" + prize1GetTimes);
System.out.println("prize2中獎(jiǎng)次數(shù)" + prize2GetTimes);
System.out.println("prize3中獎(jiǎng)次數(shù)" + prize3GetTimes);
}
}3. 抽獎(jiǎng)對(duì)象
import lombok.Data;
import java.math.BigDecimal;
@Data
public class Prize {
//獎(jiǎng)品唯一標(biāo)示
private Integer prizeId;
//中獎(jiǎng)概率
private BigDecimal probability;
//獎(jiǎng)品數(shù)量
private Integer quantity;
}執(zhí)行結(jié)果如下:

通過(guò)1000次抽取,我們看出算法精度還是很高的。
到此這篇關(guān)于利用java實(shí)現(xiàn)中獎(jiǎng)概率詳情的文章就介紹到這了,更多相關(guān)java中獎(jiǎng)概率內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java通過(guò)AOP實(shí)現(xiàn)全局日志打印詳解
最近自己一直再看現(xiàn)有微服務(wù)的日志模塊,發(fā)現(xiàn)就是使用AOP來(lái)做controller層的日志處理,加上項(xiàng)目在進(jìn)行架構(gòu)優(yōu)化,這篇文章主要給大家介紹了關(guān)于java通過(guò)AOP實(shí)現(xiàn)全局日志打印的相關(guān)資料,需要的朋友可以參考下2022-01-01
Java?Stream比較兩個(gè)List的差異并取出不同的對(duì)象四種方法
今天開(kāi)發(fā)一個(gè)需求時(shí)要對(duì)A和B兩個(gè)List集合遍歷,并比較出集合A有,而集合B沒(méi)有的值,下面這篇文章主要給大家介紹了關(guān)于Java?Stream比較兩個(gè)List的差異并取出不同對(duì)象的四種方法,需要的朋友可以參考下2024-01-01
Java中@Pattern注解常用的校驗(yàn)正則表達(dá)式學(xué)習(xí)筆記
對(duì)于正則這個(gè)東西,對(duì)我來(lái)說(shuō)一直是很懵逼的,每次用每次查,然后還是記不住,下面這篇文章主要給大家介紹了關(guān)于Java中@Pattern注解常用的校驗(yàn)正則表達(dá)式學(xué)習(xí)筆記的相關(guān)資料,需要的朋友可以參考下2022-07-07
Spring?boot?整合?Redisson實(shí)現(xiàn)分布式鎖并驗(yàn)證功能
這篇文章主要介紹了Spring?boot?整合?Redisson實(shí)現(xiàn)分布式鎖并驗(yàn)證,redisson是官方推薦的分布式鎖實(shí)現(xiàn)方案,采用redis自身的原子命令和lua腳本來(lái)實(shí)現(xiàn),需要的朋友可以參考下2022-05-05
Java如何基于okhttp請(qǐng)求SSE接口流式返回詳解
對(duì)于流式返回,Spring Boot提供了兩種不同的方式,下面這篇文章主要給大家介紹了關(guān)于Java如何基于okhttp請(qǐng)求SSE接口流式返回的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-03-03
mybatis配置文件簡(jiǎn)介_(kāi)動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要為大家詳細(xì)介紹了mybatis配置文件簡(jiǎn)介的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09
java json 省市級(jí)聯(lián)實(shí)例代碼
這篇文章介紹了java json 省市級(jí)聯(lián)實(shí)例代碼,有需要的朋友可以參考一下2013-09-09
關(guān)于Feign的覆寫默認(rèn)配置和Feign的日志
這篇文章主要介紹了關(guān)于Feign的覆寫默認(rèn)配置和Feign的日志方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06
fastjson轉(zhuǎn)換對(duì)象實(shí)體@JsonProperty不生效問(wèn)題及解決
這篇文章主要介紹了fastjson轉(zhuǎn)換對(duì)象實(shí)體@JsonProperty不生效問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08
Gateway網(wǎng)關(guān)自定義攔截器的不可重復(fù)讀取數(shù)據(jù)問(wèn)題
這篇文章主要介紹了Gateway網(wǎng)關(guān)自定義攔截器的不可重復(fù)讀取數(shù)據(jù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08

