【Java】简单随机数生成器
作者:互联网
前几年部门开始推行“抓阄”领任务的工作模式,当时写了一个简单的随机数生成器。
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