jdk.random
是 Java 17 引入的一个新包(JEP 356),提供了一系列改进的伪随机数生成器(PRNGs),作为 java.util.random
包的一部分。它增强了 Java 的随机数生成能力,提供了更多算法选择,并支持更灵活的随机数生成方式。
1. 概述
jdk.random
包的主要目标是:
-
提供更多 PRNG 算法(如 LXM、Xoroshiro、Xoshiro 等)
-
支持可插拔的随机数生成器
-
允许开发者选择不同的随机数生成策略
-
提高性能和随机性质量
它是 java.util.random
的底层实现,但提供了更细粒度的控制。
2. 核心接口和类
(1)RandomGenerator
接口
这是所有随机数生成器的基本接口,定义在 java.util.random
包中,但 jdk.random
提供了多个实现:
java
public interface RandomGenerator {
int nextInt();
long nextLong();
double nextDouble();
// ... 其他方法
}
(2)L32X64MixRandom
、L64X128MixRandom
等
jdk.random
提供了多种 PRNG 实现:
类名 | 算法 | 特点 |
---|---|---|
L32X64MixRandom |
LXM (Linear+XorMix) | 32-bit 状态,适合一般用途 |
L64X128MixRandom |
LXM | 64-bit 状态,高质量随机性 |
Xoroshiro128PlusPlus |
Xoroshiro128++ | 高性能,适用于模拟 |
Xoshiro256PlusPlus |
Xoshiro256++ | 更长的周期,适用于科学计算 |
(3)RandomSupport
工具类
提供了一些静态方法,用于创建和管理随机数生成器:
java
RandomGenerator rng = RandomSupport.getRandomGenerator("L64X128MixRandom");
3. 使用方法
(1)直接使用特定的 PRNG
java
import jdk.random.L64X128MixRandom;
RandomGenerator rng = new L64X128MixRandom();
int randomInt = rng.nextInt();
double randomDouble = rng.nextDouble();
(2)使用 RandomGeneratorFactory
动态选择算法
java
import java.util.random.RandomGeneratorFactory;
// 获取所有可用的 PRNG 算法
RandomGeneratorFactory.all()
.map(f -> f.name())
.forEach(System.out::println);
// 选择特定的 PRNG
RandomGenerator rng = RandomGeneratorFactory.of("L64X128MixRandom").create();
(3)设置种子(Seed)
java
RandomGenerator rng = new L64X128MixRandom(12345L); // 固定种子
4. 不同 PRNG 算法的比较
算法 | 周期长度 | 性能 | 适用场景 |
---|---|---|---|
L32X64MixRandom |
2³² | 快 | 游戏、简单模拟 |
L64X128MixRandom |
2⁶⁴ | 中等 | 通用随机数生成 |
Xoroshiro128PlusPlus |
2¹²⁸ - 1 | 极快 | 低延迟应用 |
Xoshiro256PlusPlus |
2²⁵⁶ - 1 | 快 | 科学计算、加密 |
5. 最佳实践
-
选择适合的算法:
-
如果只需要快速随机数(如游戏),用
Xoroshiro128PlusPlus
。 -
如果需要高质量随机数(如模拟),用
L64X128MixRandom
。
-
-
避免固定种子(除非需要可重现的随机序列)。
-
线程安全 :
jdk.random
的 PRNG 默认不是线程安全 的,多线程环境下应使用ThreadLocalRandom
或同步访问。
6. 示例:蒙特卡洛模拟
java
import jdk.random.L64X128MixRandom;
public class MonteCarloPi {
public static void main(String[] args) {
RandomGenerator rng = new L64X128MixRandom();
long inside = 0;
long trials = 1_000_000;
for (long i = 0; i < trials; i++) {
double x = rng.nextDouble();
double y = rng.nextDouble();
if (x * x + y * y <= 1.0) {
inside++;
}
}
double pi = 4.0 * inside / trials;
System.out.println("Estimated Pi: " + pi);
}
}
7. 总结
-
jdk.random
提供了更多 PRNG 算法 ,比传统的java.util.Random
更灵活。 -
可以通过
RandomGeneratorFactory
动态选择算法。 -
适用于高性能计算、模拟、游戏等场景。
-
在 Java 17+ 中可用,是现代 Java 随机数生成的推荐方式。
如果需要更强的加密随机数,仍然应该使用 java.security.SecureRandom
。