本文实例为大家分享了java使用随机数实现概率抽奖的具体代码,供大家参考,具体内容如下
需求
网站现有一抽奖功能,已经定义好奖品,每个奖品都有对应的中奖概率。通过奖品概率随机进行抽奖
实现思路
1、每个奖品都有对应的中奖概率,先对所有奖品中奖概率求和
2、计算出每个奖品在0-1之间所占的区间块
3、随机产生0-1之间的随机数,随机数落在哪个区间,就是中奖哪个
例如现有以下奖品:
奖品a 中奖概率为 0.1
奖品b 中奖概率为 0.01
奖品c 中奖概率为 0.001
奖品d 中奖概率为 0.8
第一步:求出概率总和 0.1+0.01+0.001+0.8 = 0.911
第二步:计算每个奖品的所占区间块
奖品a: 0.1 / 0.911 = 0.1098
奖品b: (0.1+0.01)/ 0.911 = 0.1207
奖品c:(0.1+0.11+0.001)/ 0.911 = 0.1218
奖品d:(0.1+0.11+0.001+0.8)/ 0.911 = 1
则:
奖品a的所占区间为:0~0.1098
奖品b的所占区间为:0.1098~0.1207
奖品c的所占区间为:0.1207~0.1218
奖品d的所占区间为:0.1218~1
代码如下
/**
* 奖品实体类
*/
public class award{
public award(){}
public award(string awardtitle,double probability){
this.awardtitle = awardtitle;
this.probability = probability;
}
/**奖品id**/
private string awardid;
/**奖品名**/
private string awardtitle;
/**中奖概率**/
private double probability;
public string getawardid() {
return awardid;
}
public void setawardid(string awardid) {
this.awardid = awardid;
}
public string getawardtitle() {
return awardtitle;
}
public void setawardtitle(string awardtitle) {
this.awardtitle = awardtitle;
}
public double getprobability() {
return probability;
}
public void setprobability(double probability) {
this.probability = probability;
}
}
public class lotteryutil {
/**
* 抽奖,获取中奖奖品
* @param awardlist 奖品及中奖概率列表
* @return 中奖商品
*/
public static award lottery(list awardlist) {
if(awardlist.isempty()){
throw new awardlistisemptyexception();
}
//奖品总数
int size = awardlist.size();
//计算总概率
double sumprobability = 0d;
for (award award : awardlist) {
sumprobability += award.getprobability();
}
//计算每个奖品的概率区间
//例如奖品a概率区间0-0.1 奖品b概率区间 0.1-0.5 奖品c概率区间0.5-1
//每个奖品的中奖率越大,所占的概率区间就越大
list sortawardprobabilitylist = new arraylist(size);
double tempsumprobability = 0d;
for (award award : awardlist) {
tempsumprobability += award.getprobability();
sortawardprobabilitylist.add(tempsumprobability / sumprobability);
}
//产生0-1之间的随机数
//随机数在哪个概率区间内,则是哪个奖品
double randomdouble = math.random();
//加入到概率区间中,排序后,返回的下标则是awardlist中中奖的下标
sortawardprobabilitylist.add(randomdouble);
collections.sort(sortawardprobabilitylist);
int lotteryindex = sortawardprobabilitylist.indexof(randomdouble);
return awardlist.get(lotteryindex);
}
public static void main(string[] args) {
list awardlist = new arraylist();
awardlist.add(new award("10个积分",0.35d));
awardlist.add(new award("33个积分",0.25d));
awardlist.add(new award("5元红包",0.002d));
awardlist.add(new award("20元话费",0.003d));
awardlist.add(new award("京东100元购物卡",0.0005d));
awardlist.add(new award("未中奖",0.1d));
map result = new hashmap();
for(int i=0;i<10000;i++){
award award = lottery(awardlist);
string title = award.getawardtitle();
integer count = result.get(title);
result.put(title, count == null ? 1 : count + 1);
}
for (entry entry : result.entryset()) {
system.out.println(entry.getkey() + ", count=" + entry.getvalue() +", reate="+ entry.getvalue()/10000d);
}
}
}
测试结果
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持萬仟网。
希望与广大网友互动??
点此进行留言吧!