peng
3 天以前 6f059454437172bbfb5901041e680382e21076f2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
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);
            }
        }
    }
 
}