首页 > 编程语言 > 详细

抽奖活动算法

时间:2019-10-12 11:38:28      阅读:69      评论:0      收藏:0      [点我收藏+]
/**
* 抽奖方法
* @param start 1
* @param end 100 抽奖范围
* @param drawList 奖品集合
* @return
*/
public static MarketAwardModel generateAward(int start,int end,List<MarketAwardModel> drawList) {
long result = randomnum(start, end);
//未遍历概率---100减去已遍历的奖品概率累加
int line ;
//已遍历概率---已遍历的奖品中奖概率累加
int temp = 0;
MarketAwardModel returnAward = null;
for (int i = 0; i < drawList.size(); i++) {
MarketAwardModel awardModel = drawList.get(i);
int awardProbability = Integer.parseInt(awardModel.getAwardProbability());
temp = temp + awardProbability;
line = end - temp;
//小于等于可使用最大几率,大于未遍历概率(包含本次)
if (awardProbability != 0 && result > line && result <= (line + awardProbability)) {
log.info("随机数:{},line:{},概率:{},temp:{}" ,result,line, awardProbability,temp);
if(Integer.parseInt(awardModel.getAwardSum())>Integer.parseInt(awardModel.getAwardReceived())){
returnAward = awardModel;
break;
}else{
returnAward = null;
}
}
}
return returnAward;
}

/**
* 生成奖项(实现根据概率随机生成中奖对象)-根据循环随机生成多个数字
* <p>
* 取出奖品列表(按照中奖概率大小倒序排列)
* 通过java的Random()方法生成一个0-1的随机数,与设置好的奖品概率循环比较
* 若随机数小于概率值,则抽中该奖项
* 换句话说就是按照随机出的数字,概率由小到大,依次中奖
*
* @return
*/
// 获取2个值之间的随机数
private static long randomnum(int smin, int smax) {
int range = smax - smin;
double rand = Math.random();
return smin + Math.round(rand * range);
}

抽奖活动算法

原文:https://www.cnblogs.com/lcxdevelop/p/11660348.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!