import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class PrizeMathRandom {
/**
* 根据随机数和概率抽取奖品
*
* @param prizes
* @return random:奖品列表prizes中的序列(prizes中的第random个就是抽中的奖品)
*/
public int getPrizeIndex(List<PrizeVo> prizes) {
int random = -1;
try {
// 计算总权重
double sumWeight = 0;
for (PrizeVo p : prizes) {
sumWeight += p.getPrize_weight();
}
// 产生随机数
double randomNumber;
int max = 100;
int min = 1;
randomNumber = new Random().nextInt(max) % (max - min + 1) + min;
randomNumber = randomNumber / sumWeight;
// 根据随机数在所有奖品分布的区域并确定所抽奖品
double d1 = 0;
double d2 = 0;
for (int i = 0; i < prizes.size(); i++) {
d2 += prizes.get(i).getPrize_weight() / sumWeight;
if (i == 0) {
d1 = 0;
} else {
d1 += prizes.get(i - 1).getPrize_weight() / sumWeight;
}
if (randomNumber >= d1 && randomNumber <= d2) {
random = i;
break;
}
}
if (random == -1) {
return prizes.size() - 1;
}
} catch (Exception e) {
System.out.println("生成抽奖随机数出错,出错原因:" + e.getMessage());
}
return random;
}
/**
* 测试主程序
*
* @param agrs
*/
public static void main(String[] agrs) {
int i = 0;
PrizeMathRandom a = new PrizeMathRandom();
int[] result = new int[8];
List<PrizeVo> prizes = new ArrayList<PrizeVo>();
// PrizeVo p1 = new PrizeVo();
// p1.setPrize_name("111");
// p1.setPrize_weight(1);
// prizes.add(p1);
// PrizeVo p2 = new PrizeVo();
// p2.setPrize_name("222");
// p2.setPrize_weight(2);
// prizes.add(p2);
//
// PrizeVo p3 = new PrizeVo();
// p3.setPrize_name("333");
// p3.setPrize_weight(3);
// prizes.add(p3);
//
// PrizeVo p4 = new PrizeVo();
// p4.setPrize_name("444");
// p4.setPrize_weight(6);
// prizes.add(p4);
//
// PrizeVo p5 = new PrizeVo();
// p5.setPrize_name("555");
// p5.setPrize_weight(6);
// prizes.add(p5);
//
// PrizeVo p6 = new PrizeVo();
// p6.setPrize_name("666");
// p6.setPrize_weight(10);
// prizes.add(p6);
PrizeVo p7 = new PrizeVo();
p7.setPrize_name("777");
p7.setPrize_weight(45);
prizes.add(p7);
PrizeVo p8 = new PrizeVo();
p8.setPrize_name("888");
p8.setPrize_weight(27);
prizes.add(p8);
System.out.println("抽奖开始");
for (i = 0; i < 100; i++)// 打印100个测试概率的准确性
{
int selected = a.getPrizeIndex(prizes);
// System.out.println("第" + i + "次抽中的奖品为:" +
// prizes.get(selected).getPrize_name());
result[selected]++;
// 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]);
System.out.println("六等奖:" + result[5]);
System.out.println("七等奖:" + result[6]);
System.out.println("八等奖:" + result[7]);
}
}
public class PrizeVo {
private int id;// 奖品id
private String prize_name;// 奖品名称
private int prize_amount;// 奖品(剩余)数量
private double prize_weight;// 奖品权重
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getPrize_name() {
return prize_name;
}
public void setPrize_name(String prize_name) {
this.prize_name = prize_name;
}
public int getPrize_amount() {
return prize_amount;
}
public void setPrize_amount(int prize_amount) {
this.prize_amount = prize_amount;
}
public double getPrize_weight() {
return prize_weight;
}
public void setPrize_weight(double prize_weight) {
this.prize_weight = prize_weight;
}
}