利用java实现中奖概率详情
作者:码农小宋??????? 时间:2021-08-10 06:56:58
1. 算法分析
根据概率将奖品划分区间,每个区间代表一个奖品,然后抽取 随机数,反查落在那个区间上,即为所抽取的奖品。
2. 代码核心算法
import com.alibaba.fastjson.JSONObject;
import java.math.BigDecimal;
import java.util.*;
//抽奖核心算法
public class Arithmetic {
// 放大倍数
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();
// 划分区间
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之间的一个随机数
int luckyNumber = new Random().nextInt(mulriple);
int luckyPrizeId = 0;
// 查找随机数所在的区间
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("抽奖次数" + times);
System.out.println("prize1中奖次数" + prize1GetTimes);
System.out.println("prize2中奖次数" + prize2GetTimes);
System.out.println("prize3中奖次数" + prize3GetTimes);
}
}
3. 抽奖对象
import lombok.Data;
import java.math.BigDecimal;
@Data
public class Prize {
//奖品唯一标示
private Integer prizeId;
//中奖概率
private BigDecimal probability;
//奖品数量
private Integer quantity;
}
执行结果如下:
通过1000次抽取,我们看出算法精度还是很高的。
来源:https://blog.51cto.com/u_15430445/5464579
标签:java,中奖,概率
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
C语言实现扫雷游戏(含注释详解)
2023-11-02 15:25:07
![](https://img.aspxhome.com/file/2023/4/107384_0s.jpg)
C#实现温度转换功能
2021-10-06 22:54:18
![](https://img.aspxhome.com/file/2023/2/69802_0s.jpg)
JavaMail入门教程之发送邮件(3)
2023-02-01 20:01:16
![](https://img.aspxhome.com/file/2023/5/71215_0s.jpg)
序列化版本号serialVersionUID的作用_动力节点Java学院整理
2022-08-14 06:39:02
MyBatis全局配置文件详解
2021-09-19 10:13:32
![](https://img.aspxhome.com/file/2023/3/69093_0s.png)
如何创建SpringBoot项目
2022-03-26 16:06:37
![](https://img.aspxhome.com/file/2023/7/68167_0s.png)
C#串口通信实现方法
2023-04-15 06:31:11
C# 添加对System.Configuration.dll文件的引用操作
2022-03-05 22:20:31
![](https://img.aspxhome.com/file/2023/7/69807_0s.jpg)
java控制台实现学生信息管理系统
2023-11-29 02:05:20
Java使用easyExcel导出excel数据案例
2022-02-21 19:39:27
![](https://img.aspxhome.com/file/2023/0/62330_0s.png)
static关键字有何魔法?竟让Spring Boot搞出那么多静态内部类(推荐)
2022-07-03 20:26:29
![](https://img.aspxhome.com/file/2023/9/70269_0s.png)
SpringBoot JPA实现增删改查、分页、排序、事务操作等功能示例
2023-06-27 23:54:05
Spring Boot实现分布式系统中的服务发现和注册(最新推荐)
2022-07-10 03:50:23
android分享纯图片到QQ空间实现方式
2023-07-20 10:56:03
Java实现浪漫流星表白的示例代码
2023-04-02 14:50:35
![](https://img.aspxhome.com/file/2023/5/68715_0s.gif)
java nio基础使用示例
2022-02-12 01:46:22
javascript 在线文本编辑器实现代码
2023-11-24 23:07:24
java多线程中的异常处理机制简析
2021-11-18 01:54:39
OpenCV Java实现人脸识别和裁剪功能
2022-08-21 01:47:23
![](https://img.aspxhome.com/file/2023/9/79279_0s.jpg)
浅谈spring的重试机制无效@Retryable@EnableRetry
2021-12-12 10:42:57
![](https://img.aspxhome.com/file/2023/5/62165_0s.jpg)