专业网站建设品牌,十四年专业建站经验,服务6000+客户--广州京杭网络
免费热线:400-683-0016      微信咨询  |  联系我们

如何用代码实现真正公平的抽奖_java

当前位置:网站建设 > 技术支持
资料来源:网络整理       时间:2023/3/7 0:40:04       共计:3569 浏览

如何用代码实现真正公平的抽奖?

先来看一个简单的实现:先将50个人进行1到50编号,然后来一段简单的java随机数代码,如下:

上图中的代码运行结果:

大家觉得这个抽奖设计的公平么?欢迎下方留言讨论~

这里介绍一下Random及ThreadLocalRandom相关知识:

int random = ThreadLocalRandom.current().nextInt(50) + 1

在java中最直接、简单的调用生成随机数方式:

new Random().nextInt()

比如生成0.0到10.0之间的双精度浮点数即:

new Random().nextDouble(10)

如果想生成整数即:

new Random().nextInt(10)

Random每次使用都得实例化一个对象

多线程下使用单个Random实例生成随机数时候,多个线程同时计算随机数计算新的种子时候多个线程会竞争同一个原子变量的更新操作,由于原子变量的更新是CAS操作,同时只有一个线程会成功,所以会造成大量线程进行自旋重试,这是会降低并发性能的,所以ThreadLocalRandom应运而生。

为了解决多线程高并发下Random的缺陷,JUC包下新增了ThreadLocalRandom类,如果每个线程维护自己的一个种子变量,每个线程生成随机数时候根据自己老的种子计算新的种子,并使用新种子更新老的种子,然后根据新种子计算随机数,就不会存在竞争问题,这会大大提高并发性能。

日常开发中,经常会有生成一批随机数的需求,比如订单号的后4位采用随机数,随机轮询,随机获取系统默认头像等,大家可以在高并发的场景中尝试一下并发包中的ThreadLocalRandom,感兴趣的同学可以去看看相关源码。

少琮持续关注科技领域问答,欢迎大家下方留言讨论,共同成长!感谢点赞、收藏、关注~

版权说明:
本网站凡注明“广州京杭 原创”的皆为本站原创文章,如需转载请注明出处!
本网转载皆注明出处,遵循行业规范,如发现作品内容版权或其它问题的,请与我们联系处理!
欢迎扫描右侧微信二维码与我们联系。
·上一条:联想系列的_java | ·下一条:JAVA学了有啥用_java

Copyright © 广州京杭网络科技有限公司 2005-2024 版权所有    粤ICP备16019765号 

广州京杭网络科技有限公司 版权所有