整体思路:
奖品集合 + 概率比例集合
将奖品按集合中的顺序概率计算成所占比例区间,放入比例集合。并产生一个随机数加入其中,进行排序。
排序后随机数落在那个区间就表示那个区间的奖品被抽中。
返回的随机数在集合中的索引,该索引就是奖品集合的中的索引。
比例区间的计算通过概率相加获得。
奖品po类
抽奖工具类:
package com.yql.sdk.util;
import com.ac.core.activity.common.po.PrizeInfo;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* 抽奖工具类<br/> * 整体思想:
* 奖品集合 + 概率比例集合
* 将奖品按集合中顺序概率计算成所占比例区间,放入比例集合。并产生一个随机数加入其中,排序。</br> * 排序后,随机数落在哪个区间,就表示那个区间的奖品被抽中。</br> * 返回的随机数在集合中的索引,该索引就是奖品集合中的索引。</br> * 比例区间的计算通过概率相加获得。
* @author yql
* @since 2018年10月17日
*/
public class LotteryDrawUtilNew {
public static int drawPrize(List prizeList){
if(null != prizeList && prizeList.size()>0){
List orgProbList =new ArrayList(prizeList.size());
for(PrizeInfo prize:prizeList){
//按顺序将概率添加到集合中
orgProbList.add(prize.getActualProbability());
}
return draw(orgProbList);
}
return -1;
}
public static int draw(List prizeProbList){
List sortRateList =new ArrayList();
// 计算概率总和
int sumRate =0;
for(Integer actualProbability : prizeProbList){
sumRate += actualProbability.intValue();
}
if(sumRate !=0){
int rate =0;//概率所占比例
for(Integer actualProbability : prizeProbList){
rate += actualProbability.intValue();
// 构建一个比例区段组成的集合(避免概率和不为1)
sortRateList.add(rate / (sumRate*1.0));
}
// 随机生成一个随机数,并排序
Double random = Math.random();
sortRateList.add(random);
Collections.sort(sortRateList);
// 返回该随机数在比例集合中的索引
return sortRateList.indexOf(random);
}
return -1;
}
/**
* 设置奖品的总概率为10000,ActualProbability为1则表示中奖率为万分之1
* <p>Title: main</p> * <p>Description: </p> * @author yql
* @param args
*/
public static void main(String[] args) {
PrizeInfo iphone =new PrizeInfo();
iphone.setId(101);
iphone.setName("苹果手机");
iphone.setActualProbability(1000);
PrizeInfo thanks =new PrizeInfo();
thanks.setId(102);
thanks.setName("再接再厉");
thanks.setActualProbability(5000);
PrizeInfo vip =new PrizeInfo();
vip.setId(103);
vip.setName("优酷会员");
vip.setActualProbability(4000);
List list =new ArrayList();
list.add(vip);
list.add(thanks);
list.add(iphone);
for(int i=0;i<100;i++){
int index =drawPrize(list);
System.out.println(list.get(index));
}
}
}
运行结果:
网友评论