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 prizes; private List probabilityIntervals; private Random random; public LotterySystem(List prizes) { // 验证概率总和是否为1 double totalProbability = 0; for (Prize prize : prizes) { totalProbability += prize.getProbability(); } // 如果总和不是1,进行归一化处理 if (Math.abs(totalProbability - 1.0) > 0.0001) { List 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 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 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 entry : result.entrySet()) { double percentage = (entry.getValue() * 100.0) / totalDraws; System.out.printf("%s: %d次 (%.2f%%)\n", entry.getKey(), entry.getValue(), percentage); } } } }