java 概率抽奖简单实现,自定义概率、奖品数量控制概率
一、不限制商品数量,只设置中奖概率
1、逻辑梳理
抽奖类无非就是控制奖品概率,定义奖品和概率关联关系,下面简单梳理代码实现逻辑:
1.定义奖品和概率: 创建一个类或数据结构来存储奖品名称和对应的中奖概率。
2. 累积概率计算: 计算所有奖品的概率总和,并构建一个累积概率数组,用于后续随机数的比较。
3.生成随机数: 使用java.util.Random或java.util.concurrent.ThreadLocalRandom生成一个介于0到概率总和之间的随机数。
4.确定奖品: 遍历累积概率数组,找到第一个大于等于生成随机数的累积概率值,从而确定中奖的奖品。
2、代码实现
创建一个奖品类
class Prize {
private String name;
private double probability;
private double cumulativeProbability;
public Prize(String name, double probability) {
this.name = name;
this.probability = probability;
}
public String getName() {
return name;
}
public double getProbability() {
return probability;
}
public double getCumulativeProbability() {
return cumulativeProbability;
}
public void setCumulativeProbability(double cumulativeProbability) {
this.cumulativeProbability = cumulativeProbability;
}
}
抽奖实现类:
import java.util.*;
public class Lottery {
// 奖品列表
private List<Prize> prizes;
// 总概率
private double totalProbability;
// 构造函数
public Lottery(List<Prize> prizes) {
this.prizes = new ArrayList<>(prizes);
calculateTotalProbability();
calculateCumulativeProbabilities();
}
/**
private void calculateTotalProbability() {
totalProbability = 0;
for (Prize prize : prizes) {
totalProbability += prize.getProbability();
}
}
/**
private void calculateCumulativeProbabilities() {
double cumulativeProbability = 0;
for (Prize prize : prizes) {
cumulativeProbability += prize.getProbability();
prize.setCumulativeProbability(cumulativeProbability);
}
}
/**
public Prize draw() {
Random random = new Random();
double randomNumber = random.nextDouble() * totalProbability;
for (Prize prize : prizes) {
if (randomNumber <= prize.getCumulativeProbability()) {
return prize;
}
}
return prizes.get(prizes.size() - 1);
}
}
抽奖操作:
public static void main(String[] args) {
List<Prize> prizes = Arrays.asList(
new Prize("一等奖", 0.05),
new Prize("二等奖", 0.1),
new Prize("三等奖", 0.2),
new Prize("安慰奖", 0.65)
);
Lottery lottery = new Lottery(prizes);
for (int i = 0; i < 100; i++) {
System.out.println(lottery.draw().getName());
}
}
**需要注意的是 循环次数 和 奖品总概率的关系,比如抽奖总概率为105,则循环105次,若果是100.5,则循环1005次, 这样设置抽奖能全部完成 。
二、通过商品数量控制中奖概率
1、逻辑梳理
和概率抽奖类似,针对性的做一些简单调整,把奖品类中的中奖概率和累积中奖概率替换成奖品数和奖品累计数量,然后抽奖时动态计算概率。
奖品类:
class Prize {
private String name;
private int quantity;
private int cumulativeQuantity;
public Prize(String name, int quantity) {
this.name = name;
this.quantity = quantity;
}
public String getName() {
return name;
}
public int getQuantity() {
return quantity;
}
public int getCumulativeQuantity() {
return cumulativeQuantity;
}
public void setCumulativeQuantity(int cumulativeQuantity) {
this.cumulativeQuantity = cumulativeQuantity;
}
}
抽奖实现类:
import java.util.*;
public class Lottery {
// 奖品列表
private List<Prize> prizes;
// 奖品总次数
private int totalQuantity;
public Lottery(List<Prize> prizes) {
this.prizes = new ArrayList<>(prizes);
calculateTotalQuantity();
calculateCumulativeQuantities();
}
/**
private void calculateTotalQuantity() {
totalQuantity = 0;
for (Prize prize : prizes) {
totalQuantity += prize.getQuantity();
}
}
/**
private void calculateCumulativeQuantities() {
int cumulativeQuantity = 0;
for (Prize prize : prizes) {
cumulativeQuantity += prize.getQuantity();
prize.setCumulativeQuantity(cumulativeQuantity);
}
}
/**
public Prize draw() {
Random random = new Random();
// 生成随机数
int randomNumber = random.nextInt(totalQuantity) + 1;
for (Prize prize : prizes) {
// 如果随机数小于等于奖品的累计次数,则返回该奖品
if (randomNumber <= prize.getCumulativeQuantity()) {
return prize;
}
}
return prizes.get(prizes.size() - 1);
}
}
抽奖:
public static void main(String[] args) {
List<Prize> prizes = Arrays.asList(
new Prize("一等奖", 5),
new Prize("二等奖", 10),
new Prize("三等奖", 20),
new Prize("安慰奖", 65)
);
Lottery lottery = new Lottery(prizes);
for (int i = 0; i < 100; i++) {
System.out.println(lottery.draw().getName());
}
}
以上是两种简单的概率抽奖实现逻辑。
相关知识
java 概率抽奖简单实现,自定义概率、奖品数量控制概率
概率事件 李健
阴阳师宠物公益概率UP活动要不要抽
妄想山海宠物吞噬概率怎么提升
抽奖活动,应该设置“多发小奖品”还是“抽幸运大奖”?
家猫携带狂犬病毒概率
一种宠物疾病概率诊断方法及系统与流程
阴阳师:宠物公益概率UP活动要不要抽 留着蓝票给SSR善男吧
如何用access计算四张扑克牌得出24点的概率
宠物生糖尿病的概率到底有多高,吃什么比较好
网址: java 概率抽奖简单实现,自定义概率、奖品数量控制概率 https://www.mcbbbk.com/newsview195496.html
上一篇: 奖品设置图片 |
下一篇: 年会互动小游戏和创意奖品盘点! |
推荐分享

- 1我的狗老公李淑敏33——如何 5096
- 2南京宠物粮食薄荷饼宠物食品包 4363
- 3家养水獭多少钱一只正常 3825
- 4豆柴犬为什么不建议养?可爱的 3668
- 5自制狗狗辅食:棉花面纱犬的美 3615
- 6狗交配为什么会锁住?从狗狗生 3601
- 7广州哪里卖宠物猫狗的选择性多 3535
- 8湖南隆飞尔动物药业有限公司宠 3477
- 9黄金蟒的价格 3396
- 10益和 MATCHWELL 狗 3352