根据权重进行抽取的算法应用比较广泛,其中抽奖便是主要用途之一。正好这几天也正在进行抽奖模块的开发,整个抽奖模块涉及到的地方大概有三处,分别是后台进行奖品的添加(同时设置权重和数量),前台根据后台配置生成抽奖队列并根据指令开始抽奖活动,最后一部分是后台统计中奖情况并设置物流状态。本文主要针对前台抽奖算法进行介绍如何根据权重设置每个奖品被抽到的概率。
抽奖算法的核心是根据权重设置随机数出现的概率,在此我将它封装成一个生成随机数的随机类,代码如下:
/**
* JAVA 返回随机数,并根据概率、比率
*
*/
public class MathRandom {
private static Log logger = LogFactory.getLog(MathRandom.class);
/**
* Math.random()产生一个double型的随机数,判断一下 每个奖品出现的概率
*
* @return int
*
*/
public int PercentageRandom(List prizes) {
DecimalFormat df = new DecimalFormat("######0.00");
int random = -2;
try{
double sumWeight = 0;
//计算总权重
for(RewardPrize rp_1 : prizes){
sumWeight += rp_1.getPrize_weight();