update:

用概率算法解决的思路,没有任何数量限制:

总数N,预计中奖数M,已中奖数K。0<=K<=M<=N

随机一个数R,区间在[0,N-K)

如果R在[0,M-K)中,则中奖,K++.

完毕.

---- ----

最近在写互动代码,里面用到了概率发奖,在网上简单搜索了一下没看到Java版本,估计太简单了。没人稀罕写,也或许又开源的方案,我没找到。

顺手把我写的发出来记录一下。这个是比较简单的版本100%,1000%的方案。记得5年前写过一个几百万人+的抽奖方案。用的是概率解法,记录中奖人数,然后用数学的方法,越往后中奖概率越高。

先发这个简单版本吧:

/**

* 伪随机数,构造从0~max的伪随机数生成器.用完了可以自动填充.

* 一般在上层业务中放到static里面.

* 不同业务建议用一个static Map去管理.

* 此处放Set,不同场景可以使用ConcrrentHashMap将对应的概率值里面放对应的业务Object.

*/

public class PseudoRandom {

private CopyOnWriteArraySet copyOnWriteArraySet;

private int max;

private Random random;

public PseudoRandom(int max){

copyOnWriteArraySet = new CopyOnWriteArraySet();

this.max = max;

refill(this.max);

}

/**

* 重新生成所有随机数

* @param max

*/

protected void refill(int max){

random = new Random(System.currentTimeMillis());

for(int i = 0; i < max; i++){

copyOnWriteArraySet.add(i);

}

}

/**

* 得到下一个随机数.

* 这个方法不用同步,因为如果在第一个线程里用完,另一个线程在初始化中,第一个线程拿到了数据,也没有关系,能保证全概率出现一遍,不会多不会少.

* 但如果是不同业务,要在上层去保证不同业务拿到不同的实例instance,如果所有业务共用这一个,业务可能会有概率不全的情况.

* @return

*/

public int next(){

int nextInt = -1;

do {

int nextTryInt = random.nextInt(max);

if(copyOnWriteArraySet.remove(nextTryInt)) {

//如果移除成功,则返回

nextInt = nextTryInt;

}else {

//判断是否已经全部出现

if (copyOnWriteArraySet.isEmpty()) {

//如果一次全概率都出现了,重新填充

refill(max);

}

}

}while(nextInt == -1);

return nextInt;

}

public static void main(String[] args){

PseudoRandom p = new PseudoRandom(10);

for(int i = 0; i<20;i++){

System.out.println(p.next());

}

}

}

java伪随机数概率_抽奖伪随机数生成器(Java)相关推荐

  1. java python算法_用Python,Java和C ++示例解释的排序算法

    java python算法 什么是排序算法? (What is a Sorting Algorithm?) Sorting algorithms are a set of instructions t ...

  2. 做Java头发少_这35个Java代码优化细节,你用了吗

    链接:https://www.jianshu.com/p/6e472304b5ac 前言 代码 优化 ,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有 ...

  3. java 判断类型_如何快速入门Java编程学习(干货)

    一.初识Java 1.生活中的程序: 从起床到教室上课的过程 穿衣打扮>起床>洗漱>出宿舍>>吃早餐>到教室 按照特定的顺序去完成某一件事的过程我们叫做生活中的程序 ...

  4. 支持java虚拟主机_为何缺乏支持Java的虚拟主机

    现在很多站长们,都青睐于香港虚拟主机建站.现在常见的是asp和PHP的程序空间很多,但是Java的少之又少,下面小编我给大家聊一聊! 一.香港Java虚拟主机成本高 使用Java程序建站,就必须要用支 ...

  5. java 课程地位_“致敬经典 一往无前”JAVA大咖论坛解读!——长沙课工场实力...

    原标题:"致敬经典 一往无前"JAVA大咖论坛解读!--长沙课工场实力 2020年8月24日,高薪工作,匠心课程,创新服务--课工场2020年夏季课程发布系列的第4场"致 ...

  6. 我的世java途径错误_我的世界JAVA路径错误的解决方法分享

    我的世界JAVA路径错误该怎么解决呢?JAVA是Minecraft运行的虚拟环境必要条件,需要您安装后才开始游戏.很多童鞋在安装过程中都遇到了JAVA路径错误的提示,这是什么原因导致的?第一手游网必须 ...

  7. java编程赋值运算符_跟我学java编程—简单赋值运算符“=”

    赋值运算符是双目运算符,用在赋值表达式中.赋值运算符将值存储在运算符左边操作数指定的变量中.有两种赋值操作,简单赋值和复合赋值,简单赋值把运算符右边的操作数的值存储在运算符左边操作数指定的变量中:复合 ...

  8. java session使用_使用Neo4j和Java进行大数据分析 第2部分

    本文的第一部分介绍了Neo4j及其Cypher查询语言.如果您已经阅读了第1部分,那么您已经了解了为什么Neo4j和其他图形数据库特别受社交图形或网络中用户之间关系建模的影响.您还在开发环境中安装了N ...

  9. java 异常信息_优雅的异常处理 -- Java中的异常

    处理异常自己处理 try-catch抛出让别人处理 throws 获得异常信息 直接打印异常对象 通过异常对象调用getMessage()方法获得 通过异常对象调用printStackTrace()方 ...

  10. java基础知识点_零基础学习Java语言,各个阶段需要掌握的知识点

    随社会的脚步的不断发展,Java技术在不断的与时俱进,这也是Java一直长盛不衰的原因之一.Java技术的学习,永远没有早晚之分,技不压身,对于21世纪的我们80后,90后,甚至00后,尤其适用! 那 ...

最新文章

  1. 172. Factorial Trailing Zeroes
  2. html 页面宽度和背景颜色,CSS:设置背景颜色为窗口宽度的50%
  3. Android开发之单例模式初探
  4. 丹佛斯变频器模拟量速度输入_变频器与PLC是如何协同作战的?了解这几个控制方式很有必要...
  5. python 加注拼音-一个将汉字转换成汉语拼音的python库的代码
  6. 小学生学python-小学生都学Python了,你还不知道如何开始
  7. 如何通过反射调用扩展方法?
  8. 微服务为什么一定要Zookeeper?
  9. 【转载】word2vec 中的数学原理详解
  10. 技术干货 | 如何在 Electron 上实现 IM SDK 聊天消息全文检索
  11. 使用作业自动清理数据库日志文件
  12. Python的视频分析
  13. idcnd传媒官方专业提供
  14. 在线PS照片处理工具 无需下载怎么编辑图片
  15. Linux电镜分析,环境扫描电子显微镜特点
  16. 微信小程序自适应深色主题DarkMode源码
  17. 从 Angular Component 和 Directive 的实例化,谈谈 Angular forRoot 方法的命令由来
  18. 阿里云虚拟主机,免费用
  19. Git Please tell me who you are
  20. sparkstreaming处理kafka数据,数据积压问题解决方案

热门文章

  1. 网络中出现的问题、原因以及解决措施总结
  2. MATLAB神经网络工具箱(代码简单实现)
  3. 报表工具(报表设计器)使用的开发历程
  4. 计算机课教学常规要求,2020学校教学常规管理制度
  5. 使用PIL改变图像分辨率
  6. 实际利率 名义利率
  7. 个性签名html,个性签名短句8个字唯美(精选70句)
  8. sql性能优化:sql Server 怎么添加全文索引+语法深度剖析+测试
  9. 穷人和富人的距离0.05厘米
  10. stl源码 vector不正规解析2 (自用)VS2019