ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

【Java】简单随机数生成器

2021-03-22 12:31:08  阅读:380  来源: 互联网

标签:Set Java 抽签 生成器 获取 Random 随机数 集合


前几年部门开始推行“抓阄”领任务的工作模式,当时写了一个简单的随机数生成器。

RESTful入口

在这里插入图片描述

首先是getLottery方法,传入参数为name(抽签人姓名)。由于要做ip有效性校验,所以先查询redis中是否已经存在“已抽签”的ip,接着就读取系统的数据字典表获取全部人员名单(一般不会这样做,当时应该是为了方便所以直接读数据字典了)。
在这里插入图片描述

通过遍历人员名单尝试与传入参数进行碰撞,若碰撞成功返回执行状态为true,若没有碰撞成功就直接结束(用人名来碰撞想想也是醉了~)。
在这里插入图片描述
遍历执行后获取成员总数,并连同姓名、当前客户端请求的ip地址一同请求getOrderList方法
在这里插入图片描述
由于返回的是人员排名名单,所以返回的是一个list的集合

获取名单列表

在这里插入图片描述
到redis中获取已经抽奖的人员名单,接着将“已抽签”名单连同随机数范围中的最小值和最大值作为参数一同调用getRandomNext方法,最终获取到一个新的随机数。
在这里插入图片描述
获取随机数后连同名字一起传到Lottery实体中并追加到redis已经抽奖人员名单中。与此同时,将抽奖者的ip给记录下来。最后由于要返回经过排序后的已抽奖名单,所以在java中通过sort的lambda语法进行了排序后返回
在这里插入图片描述

获取等量随机数

为什么生成随机数需要另外编写一个算法呢,主要是怕公司有杠精杠Java Random函数存在问题。
的确,Java中的Random是一个伪随机数,其实所有通过算法生成的“随机数”都是伪随机数。但既然有人会质疑线性同余公式(Java Random实例的生成法则)的算力,那么就写一个相对公平且不碰撞的随机数吧。
在这里插入图片描述
首先new一个Random实例,并初始化一个整型的Set集合,之后用while循环去不断生成区间内的随机数放入Set集合里面,由于Set结合的特性是排重,所以Set中的数据集合是不可能出现相同,而while条件是Set集合的个数要小于最大值所以,在做完遍历后的Set集合中应该会产生出于“最大值”相同个数的的随机数集合
在这里插入图片描述

其次,判断已抽签人数是否存在,如果存在就对List集合进行遍历,并根据Lottery对象中的indexOrder字段对随机数集合进行数据的删除操作。
这一步主要是针对已经抽签过的编号进行删除,避免编号重复。

在以上的操作都做完之后再对随机数集合获取第一个数值作为返回值。
在这里插入图片描述

这种随机数生成方式是相对比较公平,每次抽签的集合都会“排重”和“重组”。

譬如:现在有5个数,第一次随机集合顺序是 [4,2,3,5,1],因此第一个抽签的人获取到的就是4,而第二个人抽签的时候随机集合就会发生改变,变成 [5,3,1,4,2],而4在之前已经被抽过了,因此在集合中会被删除变成[5,3,1,2],因此第二个人抽到的就是5。

若要说不太公平的地方大概就是,先来的人先占坑,由于随机范围大所以“被抽中”的几率较少咯。

标签:Set,Java,抽签,生成器,获取,Random,随机数,集合
来源: https://blog.csdn.net/kida_yuan/article/details/115071896

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有