本文实例为大家分享了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(ListawardList) {

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

//每个奖品的中奖率越大,所占的概率区间就越大

ListsortAwardProbabilityList = 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) {

ListawardList = 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));

Mapresult = 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 (Entryentry : result.entrySet()) {

System.out.println(entry.getKey() + ", count=" + entry.getValue() +", reate="+ entry.getValue()/10000d);

}

}

}

测试结果

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

java实现随机数抽奖_JAVA使用随机数实现概率抽奖相关推荐

  1. java随机数转换_Java获取随机数的3种方法(转)

    随机数在实际中使用很广泛,比如要随即生成一个固定长度的字符串.数字.或者随即生成一个不定长度的数字.或者进行一个模拟的随机选择等等.Java提供了最基本的工具,可以帮助开发者来实现这一切. 一.Jav ...

  2. Java生成随机数原理_Java中随机数的产生方式与原理详解

    Java中随机数的产生方式与原理 查阅随机数相关资料,特做整理 首先说一下java中产生随机数的几种方式 在j2se中我们可以使用Math.random()方法来产生一个随机数,这个产生的随机数是0- ...

  3. java获取随机数方法_JAVA获取随机数

    原文链接: http://blog.csdn.net/herrapfel/article/details/1885016 在Java中我们可以使用java.util.Random类来产生一个随机数发生 ...

  4. java数组随机排序_JAVA 生成随机数数组,并排序输出

    package com.koal.test; import java.util.Arrays; /** * * @author hp * 排序 */ public class Sort { //要生成 ...

  5. java 取随机正整数_Java获取随机数

    Java 获取随机数 import java.util.Random; public class randomDemo { public static void main(String[]args){ ...

  6. java随机猜数_java产生随机数且猜数字游戏(源码)

    java产生随机数且猜数字游戏(源码) java产生随机数且猜数字游戏(源码) package 第二次作业; import java.util.Random;                      ...

  7. java 抽奖_java抽奖工具类:按概率抽奖

    在一些抽奖活动中,会有按概率抽取奖品的操作,本文将提供一个抽奖概率的解决方案. 假设抽奖集合如下: 奖品id 概率 1 10% 2 10% 3 20% 4 20% 生成集合 生成的连续集合为{(0.0 ...

  8. java90到100随机数生成器_java实现随机数生成器

    本文实例为大家分享了java实现随机数生成器的具体代码,供大家参考,具体内容如下 自己编的随机数生成器,比较简陋,功能也单一,当作练手. application.java package src; p ...

  9. java加权随机数抽奖_java版根据权重抽奖算法

    根据权重进行抽取的算法应用比较广泛,其中抽奖便是主要用途之一.正好这几天也正在进行抽奖模块的开发,整个抽奖模块涉及到的地方大概有三处,分别是后台进行奖品的添加(同时设置权重和数量),前台根据后台配置生 ...

最新文章

  1. 机器人编程语言python-5大机器人流行编程语言对比,你学会了哪种?
  2. C++函数的一些特性
  3. WINCE下实现USB转RS232
  4. 语言运行泰博那契数列_波浪理论的数字基础-斐波那契数列
  5. 常见数据结构的 Python 实现(建议收藏)
  6. mysql查看当前连接数
  7. 孙叫兽进阶之路之压力与绩效
  8. 初探webpack之从零搭建Vue开发环境
  9. Structs 2 session 学习
  10. ios开发之使用bundle来管理资源文件
  11. 微信小程序 云开发 图片内容安全 珊瑚图片内容安全 api
  12. 中国极地考察船“雪龙”号在南极碰撞冰山 目前人船安全
  13. 「镁客·请讲」小不点刘筱璇:新制造时代,用3D打印让世界个性起来
  14. 联想7400pro打印有横黑道
  15. 无尽学习者修炼指南 v3.0
  16. Idea同时打开多个窗口
  17. Fastadmin 后台上传视频
  18. 2022.3.12 绍兴文理学院元培学院第十五届大学生程序设计竞赛
  19. Redis应用问题解决(缓存穿透、击穿、雪崩、分布式锁)
  20. 宜出行爬取数据后处理

热门文章

  1. ViewPager2页面指示器(圆形)
  2. 选择题汇总6-7(括号里填的答案都是对的,不用管下面那个答案正确与错误,因为作者懒得删了)
  3. 嵌入式实时操作系统11——操作系统内核运行原理
  4. 安卓微信7.0版本的微信支付只支持拉起默认的微信,不支持应用双开的微信
  5. go如何实现可选参数
  6. 谈谈 雷达信号处理之脉冲压缩
  7. Python小记 Faker整理
  8. rnnlm源码分析(七)
  9. 《数字集成电路物理设计——陈春章》学习笔记
  10. 栅格计算器(不断更新中.....)