jdk.random 包详解

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)L32X64MixRandomL64X128MixRandom

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. 最佳实践

  1. 选择适合的算法

    • 如果只需要快速随机数(如游戏),用 Xoroshiro128PlusPlus

    • 如果需要高质量随机数(如模拟),用 L64X128MixRandom

  2. 避免固定种子(除非需要可重现的随机序列)。

  3. 线程安全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

相关推荐
zhangyao94033043 分钟前
关于js导入Excel时,Excel的(年/月/日)日期是五位数字的问题。以及对Excel日期存在的错误的分析和处理。
开发语言·javascript·excel
闲人编程1 小时前
Python在网络安全中的应用:编写一个简单的端口扫描器
网络·python·web安全·硬件·端口·codecapsule·扫描器
熙客1 小时前
TiDB:分布式关系型数据库
java·数据库·分布式·tidb
骑驴看星星a1 小时前
【Three.js--manual script】4.光照
android·开发语言·javascript
你想考研啊2 小时前
linux安装jdk和tomcat和并自启动
java·linux·tomcat
星释2 小时前
Rust 练习册 :Leap与日期计算
开发语言·后端·rust
悟能不能悟4 小时前
java的java.sql.Date和java.util.Date的区别,应该怎么使用
java·开发语言
Mr_Xuhhh4 小时前
GUI自动化测试--自动化测试的意义和应用场景
python·集成测试
2301_764441334 小时前
水星热演化核幔耦合数值模拟
python·算法·数学建模
循环过三天4 小时前
3.4、Python-集合
开发语言·笔记·python·学习·算法