分级奖品抽奖算法,出中奖名单
public static void main(String[] args) {
//参与抽奖人员8人
LinkedList<Integer> linkedList = new LinkedList() {{
add(0);
add(1);
add(2);
add(3);
add(4);
add(5);
add(6);
add(7);
}};
//奖品数
LinkedList<Integer> rewardList = new LinkedList() {{
add(1);//一等奖1个
add(2);//二等奖2个
add(3);//三等奖3个
}};
//保存开奖信息,<中奖人编号,奖品等级编号>
List<Map<Integer,Integer>> lotteryList = new ArrayList<>();
Random random = new Random();
while (linkedList.size() > 0) {
//随机获取幸运观众
int i = random.nextInt(linkedList.size());
//没奖品发就退出循环
if (getSum(rewardList) <= 0) {
break;
}
int lotteryLevel = getLotteryLevel(rewardList);
//都有奖品了就退出循环
if (lotteryLevel == -1) {
break;
}
//将该等级奖品数量减一
rewardList.set(lotteryLevel,rewardList.get(lotteryLevel)-1);
if (lotteryLevel <= rewardList.size()) {
Map<Integer,Integer> result=new HashMap<>();
result.put(linkedList.get(i),lotteryLevel);
lotteryList.add(result);
}
//将已经参与抽奖的人员排除
linkedList.remove(i);
}
System.out.println("恭喜这堆人 "+lotteryList.toString());
}
/**
* 计算奖品总数
*
* @param rewardList
* @return
*/
private static int getSum(LinkedList<Integer> rewardList) {
int sum = 0;
for (Integer i : rewardList) {
sum += i;
}
return sum;
}
/**
* 抽奖算法,获取奖品等级
*
* @param rewardList
* @return
*/
private static int getLotteryLevel(LinkedList<Integer> rewardList) {
Random random = new Random(System.nanoTime());
int sum = getSum(rewardList);
for (int i = 0; i < rewardList.size(); ++i) {
int randNum = Math.abs(random.nextInt()) % sum;
if (randNum < rewardList.get(i)) {
return i;
} else {
sum -= rewardList.get(i);
}
}
return -1;
}
结果: