<pre name="code" class="plain">
一共三个类,如下分别是:
奖品实体类如下:
import java.math.BigDecimal;
public class Prize {
/**
* 奖品唯一标示
*/
private Integer prizeId;
/**
* 中奖概率
*/
private BigDecimal probability;
/**
* 奖品数量
*/
private Integer quantity;
public Integer getPrizeId() {
return prizeId;
}
public void setPrizeId(Integer prizeId) {
this.prizeId = prizeId;
}
public BigDecimal getProbability() {
return probability;
}
public void setProbability(BigDecimal probability) {
this.probability = probability;
}
public Integer getQuantity() {
return quantity;
}
public void setQuantity(Integer quantity) {
this.quantity = quantity;
}
}
抽奖关键方法
import java.math.BigDecimal;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Random;
import java.util.Set;
public class Arithmetic {
// 放大倍数
private static final int mulriple = 1000;
public int pay(List<Prize> prizes) {
int lastScope = 0;
// 洗牌,打乱奖品次序
Collections.shuffle(prizes);
Map<Integer, int[]> prizeScopes = new HashMap<Integer, int[]>();
Map<Integer, Integer> prizeQuantity = new HashMap<Integer, Integer>();
for (Prize prize : prizes) {
int prizeId = prize.getPrizeId();
// 划分区间
int currentScope = lastScope + prize.getProbability().multiply(new BigDecimal(mulriple)).intValue();
prizeScopes.put(prizeId, new int[] { lastScope + 1, currentScope });
prizeQuantity.put(prizeId, prize.getQuantity());
lastScope = currentScope;
}
// 获取1-1000000之间的一个随机数
int luckyNumber = new Random().nextInt(mulriple);
int luckyPrizeId = 0;
// 查找随机数所在的区间
if ((null != prizeScopes) && !prizeScopes.isEmpty()) {
Set<Entry<Integer, int[]>> entrySets = prizeScopes.entrySet();
for (Map.Entry<Integer, int[]> m : entrySets) {
int key = m.getKey();
if (luckyNumber >= m.getValue()[0] && luckyNumber <= m.getValue()[1] && prizeQuantity.get(key) > 0) {
luckyPrizeId = key;
break;
}
}
}
if (luckyPrizeId > 0) {
// 奖品库存减一
}
return luckyPrizeId;
}
}
测试抽奖的main方法
import java.io.IOException;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import com.meidaojia.common.util.OrmUtil;
public class Test {
public static void main(String[] args) throws IOException {
List<Prize> prizes = new ArrayList<Prize>();
Prize prize1 = new Prize();
prize1.setPrizeId(1);
prize1.setProbability(new BigDecimal(0.00));
prize1.setQuantity(1);
prizes.add(prize1);
Prize prize2 = new Prize();
prize2.setPrizeId(2);
prize2.setProbability(new BigDecimal(0.10));
prize2.setQuantity(10);
prizes.add(prize2);
Prize prize3 = new Prize();
prize3.setPrizeId(3);
prize3.setProbability(new BigDecimal(0.50));
prize3.setQuantity(20);
prizes.add(prize3);
Prize prize4 = new Prize();
prize4.setPrizeId(4);
prize4.setProbability(new BigDecimal(0.20));
prize4.setQuantity(3);
prizes.add(prize4);
Prize prize5 = new Prize();
prize5.setPrizeId(5);
prize5.setProbability(new BigDecimal(0.00));
prize5.setQuantity(200);
prizes.add(prize5);
int prize1GetTimes = 0;
int prize2GetTimes = 0;
int prize3GetTimes = 0;
int prize4GetTimes = 0;
int prize5GetTimes = 0;
Arithmetic arithmetic = new Arithmetic();
int times = 10000;
for (int i = 0; i < times; i++) {
int prizeId = arithmetic.pay(prizes);
switch (prizeId) {
case 1:
prize1GetTimes++;
break;
case 2:
prize2GetTimes++;
break;
case 3:
prize3GetTimes++;
break;
case 4:
prize4GetTimes++;
break;
case 5:
prize5GetTimes++;
break;
}
}
System.out.println("抽奖次数" + times);
System.out.println("prize1中奖次数" + prize1GetTimes);
System.out.println("prize2中奖次数" + prize2GetTimes);
System.out.println("prize3中奖次数" + prize3GetTimes);
System.out.println("prize4中奖次数" + prize4GetTimes);
System.out.println("prize5中奖次数" + prize5GetTimes);
}
}