package cn.lili.modules;
|
|
import java.util.ArrayList;
|
import java.util.HashMap;
|
import java.util.List;
|
import java.util.Map;
|
import java.util.*;
|
|
public class Demo_1 {
|
|
// 奖品类
|
static class Prize {
|
private String name; // 奖品名称
|
private double probability; // 中奖概率(0-1之间)
|
|
public Prize(String name, double probability) {
|
this.name = name;
|
this.probability = probability;
|
}
|
|
public String getName() {
|
return name;
|
}
|
|
public double getProbability() {
|
return probability;
|
}
|
}
|
|
// 抽奖系统类
|
public static class LotterySystem {
|
private List<Prize> prizes;
|
private List<Double> probabilityIntervals;
|
private Random random;
|
|
public LotterySystem(List<Prize> prizes) {
|
// 验证概率总和是否为1
|
double totalProbability = 0;
|
for (Prize prize : prizes) {
|
totalProbability += prize.getProbability();
|
}
|
|
// 如果总和不是1,进行归一化处理
|
if (Math.abs(totalProbability - 1.0) > 0.0001) {
|
List<Prize> normalizedPrizes = new ArrayList<>();
|
for (Prize prize : prizes) {
|
normalizedPrizes.add(new Prize(
|
prize.getName(),
|
prize.getProbability() / totalProbability
|
));
|
}
|
this.prizes = normalizedPrizes;
|
} else {
|
this.prizes = prizes;
|
}
|
|
// 初始化概率区间
|
initProbabilityIntervals();
|
this.random = new Random();
|
}
|
|
// 初始化概率区间
|
private void initProbabilityIntervals() {
|
probabilityIntervals = new ArrayList<>();
|
double current = 0;
|
|
for (Prize prize : prizes) {
|
current += prize.getProbability();
|
probabilityIntervals.add(current);
|
}
|
}
|
|
// 执行抽奖
|
public String draw() {
|
// 生成0-1之间的随机数
|
double randomValue = random.nextDouble();
|
|
// 查找随机数落在哪个区间
|
for (int i = 0; i < probabilityIntervals.size(); i++) {
|
if (randomValue < probabilityIntervals.get(i)) {
|
return prizes.get(i).getName();
|
}
|
}
|
|
// 理论上不会走到这里
|
return "未中奖";
|
}
|
|
// 测试抽奖系统
|
public static void main(String[] args) {
|
// 创建5个奖品,设置不同的中奖概率
|
List<Prize> prizes = new ArrayList<>();
|
prizes.add(new Prize("一等奖", 0.01)); // 1%概率
|
prizes.add(new Prize("二等奖", 0.05)); // 5%概率
|
prizes.add(new Prize("三等奖", 0.1)); // 10%概率
|
prizes.add(new Prize("四等奖", 0.2)); // 20%概率
|
prizes.add(new Prize("五等奖", 0.64)); // 64%概率
|
|
// 创建抽奖系统
|
LotterySystem lottery = new LotterySystem(prizes);
|
|
// 测试10000次抽奖,查看概率分布
|
Map<String, Integer> result = new HashMap<>();
|
int totalDraws = 100000;
|
|
for (int i = 0; i < totalDraws; i++) {
|
String prizeName = lottery.draw();
|
result.put(prizeName, result.getOrDefault(prizeName, 0) + 1);
|
}
|
|
// 输出结果
|
System.out.println("抽奖" + totalDraws + "次的结果:");
|
for (Map.Entry<String, Integer> entry : result.entrySet()) {
|
double percentage = (entry.getValue() * 100.0) / totalDraws;
|
System.out.printf("%s: %d次 (%.2f%%)\n",
|
entry.getKey(), entry.getValue(), percentage);
|
}
|
}
|
}
|
|
}
|