当前位置:首页 > 后端开发 > 正文

Java如何简单生成随机数?

Java使用RandomAccessFile类实现文件随机写入,通过seek()方法定位文件指针到指定位置,再调用write()方法写入数据,写入会覆盖当前位置的原有内容,支持字节、数组等多种数据类型写入。

Math.random():基础随机数生成

原理

静态方法 Math.random() 返回 [0.0, 1.0) 之间的 double 值,底层基于 java.util.Random 实现。

适用场景

简单场景(如快速原型、非关键性随机值)。

代码示例

// 生成 [0, 100) 的整数 int num = (int) (Math.random() * 100); // 生成 [10, 20) 的浮点数 double decimal = 10 + Math.random() * 10;

注意

  • 线程安全但性能一般
  • 无法设置随机种子(可复现性差)


java.util.Random:灵活可控的随机数

原理

通过伪随机数算法(线性同余)生成整数、浮点数或布尔值。

适用场景

单线程环境下的通用随机需求(如模拟数据)。

代码示例

Random random = new Random(); // 生成 [0, 100) 的整数 int num = random.nextInt(100); // 生成 [-50, 50) 的整数 int rangeNum = random.nextInt(100) - 50; // 设置种子(可复现结果) Random seededRandom = new Random(12345);

优点

  • 支持种子(可复现测试)
  • 提供多种数据类型(nextBoolean(), nextDouble())

    缺点

  • 多线程下性能瓶颈(需同步锁)


ThreadLocalRandom:高并发优化

原理

为每个线程分配独立随机数生成器,避免资源竞争。

适用场景

多线程高并发场景(如服务器端批量任务)。

代码示例

Java如何简单生成随机数? 第1张

// 生成 [1, 100] 的整数 int num = ThreadLocalRandom.current().nextInt(1, 101); // 生成高斯分布随机值 double gaussian = ThreadLocalRandom.current().nextGaussian();

优点

  • 线程间无竞争(性能提升显著)
  • 无需显式初始化

    注意

  • Java 7+ 支持
  • 不可设置全局种子(每个线程独立种子)


SecureRandom:密码学安全随机数

原理

基于操作系统熵源(如硬件噪声)生成不可预测的随机数,符合 FIPS 140-2 安全标准。

适用场景

安全敏感操作(如令牌生成、加密密钥)。

代码示例

Java如何简单生成随机数? 第2张

Java如何简单生成随机数? 第3张

SecureRandom secureRandom = new SecureRandom(); // 生成20字节的安全随机数 byte[] bytes = new byte[20]; secureRandom.nextBytes(bytes); // 生成大范围整数(0 到 2^48-1) long secureLong = secureRandom.nextLong() & 0xFFFFFFFFFFFFL;

优点

  • 抗预测攻破(适用于密码学)
  • 支持多种算法(如 NativePRNG、SHA1PRNG)

    缺点

  • 性能较低(比 Random 慢 10-50 倍)
  • 初始化可能阻塞(等待系统熵)


方法对比与选型建议

方法 线程安全 性能 安全性 适用场景
Math.random() 简单快速生成
Random (需同步) 单线程可控随机
ThreadLocalRandom 高并发、多线程任务
SecureRandom 加密、令牌、密钥生成

最佳实践

  • 优先用 ThreadLocalRandom 替代 Random(Java 7+项目)
  • 敏感数据必须用 SecureRandom
  • 测试时通过固定种子(Random(seed))复现结果

引用说明

  1. Oracle官方文档:Random类
  2. Java安全指南:SecureRandom
  3. 并发编程实践:ThreadLocalRandom
  4. 密码学标准:NIST FIPS 140-2(安全随机数规范)

通过合理选择API,可平衡性能、安全与业务需求,实际开发中,推荐使用ThreadLocalRandom作为默认方案,并在安全场景强制启用SecureRandom。

0