上一篇                     
               
			  Java如何生成随机数?
- 后端开发
- 2025-06-15
- 2313
 在Java中生成随机整数常用
 
 
java.util.Random类或
 ThreadLocalRandom类,
 new Random().nextInt(51) + 30可生成30-80范围的整数,其中51是范围跨度(80-30+1)。
方法1:使用 java.util.Random 类
 
最基础的随机数生成方式,适合一般场景。
代码示例:
import java.util.Random;
public class RandomExample {
    public static void main(String[] args) {
        Random random = new Random();
        // 生成 [0, 100) 的随机整数
        int num1 = random.nextInt(100); 
        // 生成 [-50, 50) 的随机整数
        int num2 = random.nextInt(101) - 50; 
        // 生成任意范围的整数(如 [10, 20])
        int min = 10, max = 20;
        int num3 = random.nextInt(max - min + 1) + min;
    }
} 
特点:
- 简单易用,性能较高
- 非线程安全(多线程需额外同步)
- 随机性可预测,不适用于安全敏感场景
方法2:使用 Math.random() 方法
 
基于 Random 类的静态快捷方式,生成 [0.0, 1.0) 的随机浮点数。
代码示例:

public class MathRandomExample {
    public static void main(String[] args) {
        // 生成 [0, 99] 的整数
        int num1 = (int) (Math.random() * 100);
        // 生成 [min, max] 的整数(如 [5, 15])
        int min = 5, max = 15;
        int num2 = (int) (Math.random() * (max - min + 1)) + min;
    }
} 
特点:
- 单行代码快速生成
- 底层依赖 Random类,同样非线程安全
- 仅适用于基本需求,灵活性较低
方法3:使用 ThreadLocalRandom 类(Java 7+)
 
专为多线程优化的高性能方案,推荐并发场景使用。
代码示例:
import java.util.concurrent.ThreadLocalRandom;
public class ThreadLocalRandomExample {
    public static void main(String[] args) {
        // 生成 [0, 100) 的整数
        int num1 = ThreadLocalRandom.current().nextInt(100);
        // 生成 [min, max] 的整数(如 [-10, 10])
        int num2 = ThreadLocalRandom.current().nextInt(-10, 11);
    }
} 
特点:

- 线程安全且无锁竞争,性能优于 Random
- 直接支持范围区间参数
- 适用于高并发程序(如Web服务)
方法4:使用 SecureRandom 类
 
加密级安全随机数生成器,适用于密码学操作。
代码示例:
import java.security.SecureRandom;
public class SecureRandomExample {
    public static void main(String[] args) {
        SecureRandom secureRandom = new SecureRandom();
        // 生成 32 位随机整数
        int num = secureRandom.nextInt();
        // 生成 [0, 1000) 的安全随机整数
        int boundedNum = secureRandom.nextInt(1000);
    }
} 
特点:
- 通过加密算法(如 SHA1PRNG)生成不可预测随机数
- 性能较低,但满足安全需求(如令牌生成)
- 线程安全
总结与选型建议
| 场景 | 推荐方法 | 理由 | 
|---|---|---|
| 一般单线程程序 | Random或Math.random | 简单高效 | 
| 高并发多线程程序 | ThreadLocalRandom | 无锁设计,避免性能瓶颈 | 
| 密码、密钥等安全敏感场景 | SecureRandom | 符合加密标准(如 FIPS 140) | 
关键注意:
- 范围生成公式:
random.nextInt(max - min + 1) + min确保覆盖[min, max]。- 避免在循环中重复创建
Random实例(尤其多线程),防止随机性下降。- 敏感场景务必使用
SecureRandom,例如生成验证码或会话ID。
引用说明: 基于 Oracle 官方文档 Java 17 API 规范,并结合密码学安全标准 NIST SP 800-90A 对安全随机数的要求,代码示例经过 JDK 17 环境验证。
 
 
 
			