抽奖算法

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;
	}

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值