Java产生随机数的代码怎么写,有哪些常用方法?

Java生成随机数主要通过java.util.Random类、Math.random()方法、ThreadLocalRandom和SecureRandom,其中Random类最通用,ThreadLocalRandom适合并发,SecureRandom用于加密场景。

Java产生随机数的几种方法对比

生成随机数在Java开发中几乎处处可见,但不同方法在性能、安全性和使用便利性上差异明显,下面逐一拆解。

java生成随机数的三种方式
加载中
java生成随机数的三种方式

java.util.Random类

这是最经典的方式,通过new Random()创建实例,核心方法包括nextInt()、nextDouble()、nextLong()等,构造时可指定种子,例如new Random(seed),种子相同,生成的随机序列就相同,据Java API文档,Random使用48位线性同余算法,多数场景够用,但不宜用于密码学。

  • 创建方式:Random r = new Random();
  • 常用方法:r.nextInt(100) 生成0-99的随机整数;r.nextDouble() 生成0.0-1.0的double。
  • 特点:非线程安全,多线程调用需加锁或使用ThreadLocalRandom。

Math.random()方法

这是最简单的单行方案。Math.random() 内部调用Random类,返回double值在0.0到1.0之间,优点是语法简洁,缺点是无法直接生成整数或指定范围,需要额外运算,例如生成0-99的整数:(int)(Math.random() 100),适合对随机性要求不高的快速原型。

ThreadLocalRandom

Java 7引入,专门用于多线程环境,每个线程维护独立的Random实例,避免了锁竞争,性能优于共享Random,使用方式:ThreadLocalRandom.current().nextInt(100),注意它不能显式设置种子,因此无法复现随机序列,在高并发场景下,行业共识推荐优先使用ThreadLocalRandom。

SecureRandom

当需要加密强随机数时(如生成令牌、密钥),必须使用SecureRandom,它继承自Random,但算法更强(如SHA1PRNG、NativePRNG),创建方式:

Java产生随机数的代码怎么写,有哪些常用方法?

SecureRandom sr = new SecureRandom(),性能比Random慢,但安全性高,据Oracle官方文档,SecureRandom会从操作系统熵源获取种子,不可预测。

对比表格

方法 线程安全 性能 可设种子 加密安全
Random 否 快 是 否
Math.random() 是(内部同步) 中等 否 否
ThreadLocalRandom 是 最快 否 否
SecureRandom 是 慢 支持扩展 是

Java随机数范围怎么设置

实际开发中,多数场合需要生成特定范围的随机数,比如游戏中的伤害值、抽奖概率、测试数据,下面给出常见范围的实现代码。

生成0到n的随机整数

使用Random.nextInt(n)直接生成0(含)到n(不含)的整数,例如nextInt(100)返回0-99,如果n是0或负数,会抛出异常,注意nextInt()的边界是左闭右开。

生成指定范围整数(如m到n)

公式:m + random.nextInt(n - m + 1),生成m到n(含两端)的整数,例如生成5到10:5 + random.nextInt(6),也可以用nextInt(n - m + 1) + m,如果使用Math.random(),则需(int)(Math.random() (n - m + 1) + m)。

生成随机浮点数范围

Random.nextDouble()返回0.0-1.0,要映射到m到n:m + random.nextDouble() (n - m),注意结果仍为double,包含m但不包含n,如果需要包含n,可微调公式。

代码示例

Random r = new Random();
// 整数范围 1-100
int num = 1 + r.nextInt(100);
// 浮点数范围 0.5-1.5
double d = 0.5 + r.nextDouble()  1.0;

Java产生随机数的代码怎么写,有哪些常用方法?

Java随机数种子对结果的影响

种子是随机数生成器的初始状态,相同种子保证每次运行产生相同的随机序列,这在调试和测试中非常有用。

创建Random对象时指定种子

Random r = new Random(42),只要种子是42,后续r.nextInt()每次调用都会返回固定序列,这在复现bug或做A/B测试时很有价值,但注意,如果两次运行之间改变了Random的调用次数,结果会错位。

种子相同的随机序列相同

业内专家指出,在游戏中的“种子地图”或“随机种子世界”就是利用这一特性:只传输种子,双方各自生成相同的地形,Java中,Random的setSeed(long seed)可以重置种子,但这会重新初始化生成器,导致序列从新种子开始。

不指定种子时如何工作

不传种子时,Random构造函数内部使用System.nanoTime()和计数器组合作为种子,确保每次运行结果不同,SecureRandom则从操作系统熵池获取种子,更不可预测。

Java随机数在并发场景下的选择

多线程环境中使用Random很容易出现性能瓶颈或数据错误,下面讨论如何正确选择。

Random的线程安全缺陷

Random的nextInt()等方法内部使用原子变量更新种子,本身是线程安全的,但多个线程竞争同一个Random实例会导致大量CAS失败,性能急剧下降,统计显示,高并发下共享Random的吞吐量可能只有ThreadLocalRandom的十分之一。

ThreadLocalRandom的使用

ThreadLocalRandom.current()返回当前线程的Random实例,无需传参,也不需创建对象,它自动管理每个线程的种子,彻底消除竞争,推荐写法:ThreadLocalRandom.current().nextInt(0, 100),注意它不能跨线程传递,否则会抛出异常。

性能对比示例

在8个线程各生成100万次随机数时,ThreadLocalRandom完成时间约0.2秒,而共享Random需要约2秒,如果使用加锁,时间更长,高并发应用首选ThreadLocalRandom。

Java产生随机数的代码怎么写,有哪些常用方法?

实战:生成随机验证码

验证码是随机数在Web开发中的常见应用,下面演示如何生成包含数字和字母的验证码。

生成纯数字验证码

Random r = new Random();
StringBuilder code = new StringBuilder();
for (int i = 0; i < 6; i++) {
    code.append(r.nextInt(10));
}
// 输出类似 "483921"

生成字母数字混合验证码

String chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
SecureRandom sr = new SecureRandom();
StringBuilder code = new StringBuilder();
for (int i = 0; i < 6; i++) {
    code.append(chars.charAt(sr.nextInt(chars.length())));
}
// 输出类似 "A3X9K2"

这里使用SecureRandom是为了防止暴力破解预测,如果只是展示用途,Random也可以。

Java产生随机数常见问题

Java随机数怎么生成一定范围内的随机数?

使用Random.nextInt(n)生成0到n-1的整数,然后通过m + nextInt(n - m + 1)得到m到n的整数,浮点数则用m + nextDouble() (n - m),注意边界是左闭右开,含左不含右。

SecureRandom和Random有什么区别?

Random使用线性同余算法,速度快但可预测,不适合加密,SecureRandom使用更复杂的算法,如SHA1PRNG,并依赖操作系统熵源,产生不可预测的随机数,但性能较低,如果涉及安全令牌、密钥生成,必须用SecureRandom。

如何保证每次运行生成相同的随机数序列?

创建Random对象时指定固定种子,例如new Random(12345),后续调用nextInt()等方法的顺序保持一致,则每次运行结果完全相同,但注意,如果代码中修改了随机数调用次数,序列会偏移。

首发原创文章,作者:王坚‌,如若转载,请注明出处:https://idctop.com/java%e4%ba%a7%e7%94%9f%e9%9a%8f%e6%9c%ba%e6%95%b0%e7%9a%84%e4%bb%a3%e7%a0%81%e6%80%8e%e4%b9%88%e5%86%99%ef%bc%8c%e6%9c%89%e5%93%aa%e4%ba%9b%e5%b8%b8%e7%94%a8%e6%96%b9%e6%b3%95%ef%bc%9f/

赞 (0)
服务器网站加速模式,CDN对服务器还是域名加速?,如何选择?
上一篇 2026年8月4日 19:42
Java代码生成器如何使用?,有哪些注意事项?
下一篇 2026年8月4日 19:46

相关推荐

  • 带显卡的云服务器哪家性价比高,租用一个月多少钱?

    开篇答案带显卡的云服务器6,指的是搭载6颗GPU加速卡的高性能计算实例,它的核心价值在于让中小型AI团队用几小时的租金换取原来需要几十万硬件投入的算力,如果你手上正拿着大模型微调、批量渲染或者高并发推理的需求,这类实例就是当下最省心的算力方案,带显卡的云服务器6配置怎么选:六个维度锁定目标实例选配置这件事,最容……

    2026年10月16日
    100
  • android开发图片怎么处理?Android图片加载框架推荐

    在Android应用开发的全生命周期中,图片处理始终是决定应用性能与用户体验的核心环节,高效、稳定且流畅的图片加载方案,直接决定了应用的留存率与用户满意度,图片不仅是界面的视觉核心,更是内存溢出(OOM)与UI卡顿的主要诱因,掌握一套成熟的图片加载策略与缓存机制,是每一位开发者进阶的必经之路, 图片加载的核心痛……

    2026年3月27日
    10300
  • 云计算书籍有哪些值得推荐?云计算入门学习路线是什么

    关于云计算的书籍推荐在数字化浪潮席卷全球的今天,云计算已不再仅仅是IT基础设施的代名词,而是企业数字化转型的核心引擎,面对市场上琳琅满目的云服务商和复杂的技术架构,许多开发者与企业决策者往往感到迷茫,除了系统性的理论学习,实战性的服务器测评与选型指南往往是连接理论与实践的关键桥梁,本文将基于E-E-A-T(经验……

    2026年6月4日
    3700
  • SNMP C开发常见错误?如何解决协议实现问题

    使用C语言进行SNMP网络设备监控开发SNMP核心原理SNMP是管理网络设备的核心协议,采用管理器/代理模型工作,管理器(NMS)通过UDP 161端口向代理发送请求,代理监听UDP 161端口响应请求或发送Trap(端口162),核心数据结构MIB(管理信息库)使用树状OID标识符定位设备参数,例如.1.3……

    2026年2月15日
    15160
  • 微猫开发怎么样?微猫开发公司哪家专业

    在数字化转型的浪潮中,企业与个人开发者面临着应用开发成本高、周期长、维护难的痛点,微猫 开发模式以其高效、低代码、模块化的核心优势,成为解决这一痛点的最佳方案,它能够帮助企业以最小的时间成本实现业务逻辑的数字化落地,同时保障系统的稳定性与扩展性,这一模式不仅仅是工具的革新,更是开发流程与业务交付方式的重构,是当……

    2026年3月17日
    11500
  • 嵌入式软件与系统开发难吗?嵌入式软件与系统开发学习路径和就业前景

    构建智能设备的坚实底座嵌入式软件与系统开发是现代智能硬件创新的核心驱动力,其质量直接决定终端产品的可靠性、实时性与能效表现,不同于通用计算平台,嵌入式系统受限于资源(CPU、内存、功耗),需在硬性约束下实现功能闭环,本文从工程实践角度,系统梳理开发关键路径与前沿趋势,为开发者提供可落地的技术指南,嵌入式系统开发……

    程序开发 2026年4月16日
    6400
  • 汕头微信开发哪家好?汕头微信小程序开发公司推荐

    在当前数字化转型的浪潮中,汕头企业要想在激烈的市场竞争中突围,必须构建私域流量池,而汕头 微信开发正是实现这一目标的关键基础设施,核心结论在于:标准化的SaaS模板已无法满足企业个性化的业务需求,定制化的微信开发能够深度打通企业内部管理系统与外部营销渠道,实现数据资产私有化,从而显著提升运营效率与客户转化率,企……

    2026年4月8日
    7200
  • 公有云和私有云到底选哪个?如何选择适合企业的云服务

    公有云与私有云对比分析报告在数字化转型的深水区,企业IT基础设施的选型已不再仅仅是技术决策,更是关乎数据安全、成本控制与业务敏捷性的战略抉择,随着2026年云计算市场的进一步成熟,公有云与私有云的边界日益模糊,混合云架构成为主流,但厘清两者的核心差异依然是构建稳健IT架构的第一步,本报告基于大量真实服务器部署案……

    2026年6月24日
    2000
  • 百度云服务器续费怎么操作,百度云服务器续费多少钱?

    百度云服务器续费这件事,核心答案只有一个:别等到期再续,在实例到期前7天内且产品未下架时,直接走控制台的”续费”入口操作,配合代金券和满减活动,多数情况下能比临时续费便宜不少,还能避免数据迁移的麻烦,百度云服务器续费价格怎么算才不花冤枉钱很多朋友第一次接触百度云服务器续费,心里都没底,担心被原价”收割”,其实搞……

    2026年10月20日
    100
  • 虚拟机键鼠共享如何配置?VMware多系统同步方法有哪些?

    通过虚拟化软件自带的“鼠标键盘共享”功能或第三方跨平台剪贴板工具,让宿主机和虚拟机之间实现键盘输入的无缝切换,无需额外物理设备,虚拟机按键共享怎么设置?先分清你用的是哪款虚拟机不同虚拟化软件的设置路径差异很大,行业共识认为,Vmware Workstation 和 VirtualBox 占了个人用户绝大多数的使……

    2026年9月4日
    400

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注