根据权重进行抽取的算法应用比较广泛,其中抽奖便是主要用途之一。正好这几天也正在进行抽奖模块的开发,整个抽奖模块涉及到的地方大概有三处,分别是后台进行奖品的添加(同时设置权重和数量),前台根据后台配置生成抽奖队列并根据指令开始抽奖活动,最后一部分是后台统计中奖情况并设置物流状态。本文主要针对前台抽奖算法进行介绍如何根据权重设置每个奖品被抽到的概率。

抽奖算法的核心是根据权重设置随机数出现的概率,在此我将它封装成一个生成随机数的随机类,代码如下:

/**

* 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();

}

double randomNumber;

randomNumber = Math.random();

System.out.println("randomNumber是:" + randomNumber);

double d1 = 0;

double d2 = 0;

for(int i=0;i

d2 += Double.parseDouble(String.valueOf(prizes.get(i).getPrize_weight()))/sumWeight;

if(i==0){

d1 = 0;

}else{

d1 +=Double.parseDouble(String.valueOf(prizes.get(i-1).getPrize_weight()))/sumWeight;

}

if(randomNumber >= d1 && randomNumber <= d2){

random = i;

System.out.println("d1是:" + d1);

System.out.println("d2是:" + d2);

break;

}

}

}catch(Exception e){

System.out.println(e.getMessage());

logger.error("生成抽奖随机数出错,出错原因:" + e.getMessage());

random = -1;

}

return random;

}

/**

* 测试主程序

*

* @param agrs

*/

public static void main(String[] agrs) {

int i = 0;

MathRandom a = new MathRandom();

List prizes = new ArrayList();

for(int m=0;m<100;m++){

RewardPrize rp = new RewardPrize();

rp.setPrize_amount(10);//每个奖品数量设置10个

rp.setPrize_weight(1);//每个奖品的权重都设置成1,也就是每个奖品被抽到的概率相同(可根据情况自行设置权重)

prizes.add(rp);

}

for (i = 0; i <= 100; i++)// 打印100个测试概率的准确性

{

System.out.println(a.PercentageRandom(prizes));

}

}

}

简单介绍一下上面的代码含义,首先计算出待选奖品的总权重,这样做的目的是可以随意设置奖品权重,不必再考虑权重之和是否等于100。随机规则是首先生成一个随机数randomNumber(生成的随机数位于0到1的左开右闭区间),然后分别计算出当前奖品前前面所有有奖品(不包括当前奖品)的概率和d1和当前奖品后面(包括当前奖品)所有奖品的概率和d2,然后判断生成的随机数randomNumber是否已处于d1和d2之间,如果处于该区间之内则当前奖品将被抽中。

版权声明:本文为博主原创文章,未经博主允许不得转载。

原文:http://blog.csdn.net/a1314517love/article/details/47276663

java加权随机数抽奖_java版根据权重抽奖算法相关推荐

  1. java 阶乘 最大整数_Java版超大整数阶乘算法-10,0000级

    当计算超过20以上的阶乘时,阶乘的结果值往往会很大.一个很小的数字的阶乘结果就可能超过目前个人计算机的整数范围.如果需求很大的阶乘,比如1000以上完全无法用简单的递归方式去解决.在网上我看到很多用C ...

  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高效的随机数生成器

    #java##Java##程序员# JAVA高效的随机数生成器-1.jpg (76.11 KB, 下载次数: 0) 2020-11-14 23:27 上传 不知好几年前的一个问题:假设你希望产生位于0 ...

  5. java 加密_Java版SMS4加密解密算法

    特别说明:该专栏文章均来源自微信公众号<大数据实战演练>,欢迎关注! 前言 最近工作中需要实现HBase自定义扩展sms4加密,今天就先来说一下Java版的SMS4加密解密算法的具体实现. ...

  6. java编程之拼图_java版拼图

    基于java的拼图小游戏 学习java也有一段时间了,但是一直处于控制台的编程阶段,乏味的控制台看久了有没有给人一种很枯燥乏味的感觉呢?于是乎博主开始自己学习java的swing组件,让我们的程序可以 ...

  7. java俄罗斯方块英文书籍_Java版俄罗斯方块

    Java版俄罗斯方块 08年写的一个Java版俄罗斯方块程序 界面做的中规中矩,每种形状颜色都不相同 程序控制还可以,没什么大的Bug 消磨时间的时候可以Down下来玩玩 下载链接:http://do ...

  8. java一键换壁纸_Java 版下载必应每日壁纸并自动设置 Windows 系统桌面(改编自 C# 版)...

    哈哈,好久没有写博客了,已经荒废了,前几天在某 IT 网站看到一个用 C# 写的设置必应每日壁纸为 Windows 系统桌面,看了看源码是通过调用 User32.dll 进行设置的,刚刚最近做的项目更 ...

  9. java 数独算法_java版数独游戏核心算法(一)

    之前学习javascript时用javascript写过一个数独游戏,最近看了一点java的内容,于是就心血来潮想搞一个java版的数独游戏. 现在将全部代码分享出来和大家学习交流,当然代码中有着各种 ...

最新文章

  1. Codeforces Round #370 (Div. 2)
  2. ubuntu16.0.4 opencv4.0.0 yolov3测试
  3. 【LeetCode OJ】Remove Duplicates from Sorted List
  4. 品牌网络推广方案浅析网站改版时如何更好地规避降权风险?
  5. 算法:正则表达式匹配
  6. Excel 技巧篇-公式实现在指定范围内生成指定小数位的随机数
  7. 基于PyTorch框架的多层全连接神经网络实现MNIST手写数字分类
  8. g++编译c++11 thread报错问题 及c++多线程操作
  9. codevs1521 华丽的吊灯
  10. labelme安装_语义图像分割-DIGITS2-labelme数据集自动扩展
  11. MySQL 表和列的注释的添加以及查看
  12. 网传各高校教授经典语录
  13. 网络流 poj 2195
  14. unity脚本生命流程
  15. NMEA0183格式GPS数据详解
  16. 在移动硬盘上装双系统(一个Ventory+微PE,一个Win10家庭版)
  17. Docker在蚂蚁金融云平台中的探索与实践
  18. OC中类目(Catagory)和扩展(Extension)的使用
  19. 头条号想过新手,但指数却一直达不到650,该怎么过新手?
  20. vue项目中-打印页面中部分区域的内容

热门文章

  1. Java三大主流开源工作流引擎分析
  2. 如何关闭iOS系统自动更新?最新屏蔽升级描述文件下载
  3. Vue基础知识总结 6:vue双向绑定原理
  4. C#理发店会员管理系统v1.0
  5. 单片机c51中断 — 中断扫描法行列式键盘
  6. python实现声音波形FIR滤波
  7. 定制自己的Springboot控制台输出广告横幅--banner
  8. 11月11日在线研讨会预热 | ODX诊断数据库转换工具 — VDC(ODX)
  9. clio7.0测试软件如何安装,原装CLIO10.2 QC电声测试仪
  10. 奖金100万!北大“韦神”获奖了!