根据概率
随机
package com.lalala.test;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;
/**
* 测试 抽奖概率问题
*/
public class TokenAward {
public static void main(String[] args) {
Take take = new Take();
int[] result = new int[5];
Prize p1 = new Prize(1, "奥迪", 0.0000000001);
Prize p2 = new Prize(1, "小车", 0.002);
Prize p3 = new Prize(1, "笔记本", 0.003);
Prize p4 = new Prize(1, "铅笔", 0.4);
Prize p5 = new Prize(1, "未中奖!!!", 0.8);
List<Prize> list = new ArrayList<>();
list.add(p1);
list.add(p2);
list.add(p3);
list.add(p4);
list.add(p5);
for (int i = 1; i <= 10000; i++) {
int index = take.getPrizeIndex(list);
System.out.println("第" + i + "次抽中的奖品为:" + list.get(index).getName());
result[index]++;
System.out.println("--------------------------------");
}
System.out.println("抽奖结束");
System.out.println("每种奖品抽到的数量为:");
System.out.println("一等奖:" + result[0]);
System.out.println("二等奖:" + result[1]);
System.out.println("三等奖:" + result[2]);
System.out.println("四等奖:" + result[3]);
System.out.println("五等奖:" + result[4]);
}
}
class Take {
/**
* 根据Math.random()产生一个double型的随机数,判断每个奖品出现的概率
*
* @param prizes
* @return random:奖品列表prizes中的序列(prizes中的第random个就是抽中的奖品)
*/
public synchronized int getPrizeIndex(List<Prize> prizes) {
int random = -1;
try {
//计算总概率
double count = 0;
for (Prize p : prizes) {
count += p.getProbabillity();
}
//产生随机数
double randomNumber = Math.random();
//根据随机数在所有奖品分布的区域并确认所抽奖品
double d1 = 0;
double d2 = 0;
for (int i = 0; i < prizes.size(); i++) {
d2 += Double.parseDouble(String.valueOf(prizes.get(i).getProbabillity()))/count;
if (i == 0) {
d1 = 0;
} else {
d1 += Double.parseDouble(String.valueOf(prizes.get(i - 1).getProbabillity()))/count;
}
if (randomNumber >= d1 && randomNumber <= d2) {
random = i;
break;
}
}
} catch (Exception e) {
System.out.println("抽奖出现异常,请重试---出错原因:-->>" + e.getMessage());
}
return random;
}
}
class Prize {
private int id;//奖品id
private String name;//奖品名称
private double probabillity;//概率
public Prize(int id, String name, double probabillity) {
this.id = id;
this.name = name;
this.probabillity = probabillity;
}
public Prize() {
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getProbabillity() {
return probabillity;
}
}