public static void main(String[] args) {
Map<String,Integer> map = new HashMap<String, Integer>();
map.put("1万元", 1); // 0.00009 (中奖概率:1/11015)
map.put("1100元", 4); // 0.00036
map.put("100元", 10); // 0.0009
map.put("10元", 1000); // 0.09
map.put("1元", 10000); // 0.9
// 将所有奖品乘以其中奖概率分子值,放入到奖池集合中
// 就是所有奖品的中奖概率,先换算成分母相同,然后分子是几就是几份,
// 这样,把所有奖品放到一个list集合中。生成随机数作为索引抽奖
// 集合中的数据示例:{1万元,10元,10元,10元,1元...}
List<String> jc = new ArrayList<String>();
Set<Entry<String,Integer>> entrySet = map.entrySet();
for(Entry<String,Integer> entry:entrySet) {
String key = entry.getKey();
Integer value = entry.getValue();
for(int i=0;i<value;i++) {
jc.add(key);
}
}
//
// System.out.println(jc);
// 随机从奖池中抽奖
int size = jc.size();
System.out.println(size);
int random = (int)(Math.random()*size+1);//【1,1+size)
int index = random-1;
String jp = jc.get(index);
System.out.println(index);
System.out.println(jp);
// 查看中奖概率
System.out.println("查看中奖概率");
Map<String,Integer> map2 = new HashMap<String, Integer>();
int jp11 = 0;
int jp22 = 0;
int jp33 = 0;
int jp44 = 0;
int jp55 = 0;
for(int i=0;i<1000000;i++) {
int random2 = (int)(Math.random()*size+1);//【1,1+size)
int index2 = random2-1;
String jp2 = jc.get(index2);
if(jp2.equals("1万元")) {
map2.put(jp2, jp11++);
}
if(jp2.equals("1100元")) {
map2.put(jp2, jp22++);
}
if(jp2.equals("100元")) {
map2.put(jp2, jp33++);
}
if(jp2.equals("10元")) {
map2.put(jp2, jp44++);
}
if(jp2.equals("1元")) {
map2.put(jp2, jp55++);
}
}
System.out.println(map2);
}
1百万次抽奖后,中奖概率基本和预想的一致
还有一种方式,相邻奖品的概率值累计,得到每个奖品的累计值(可以认为是从左到右排列,另外设置一个最左边的值为0),
然后,根据实际数据,取一个随机小数,这个小数在哪个以上排列的数据范围内,就取右边的数据,对应的奖品就中奖了
网友评论