当前位置: 首页 > news >正文

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 提供了多个实现:

public interface RandomGenerator {int nextInt();long nextLong();double nextDouble();// ... 其他方法
}

(2)L32X64MixRandomL64X128MixRandom 等

jdk.random 提供了多种 PRNG 实现:

类名算法特点
L32X64MixRandomLXM (Linear+XorMix)32-bit 状态,适合一般用途
L64X128MixRandomLXM64-bit 状态,高质量随机性
Xoroshiro128PlusPlusXoroshiro128++高性能,适用于模拟
Xoshiro256PlusPlusXoshiro256++更长的周期,适用于科学计算

(3)RandomSupport 工具类

提供了一些静态方法,用于创建和管理随机数生成器:

RandomGenerator rng = RandomSupport.getRandomGenerator("L64X128MixRandom");

3. 使用方法

(1)直接使用特定的 PRNG

import jdk.random.L64X128MixRandom;RandomGenerator rng = new L64X128MixRandom();
int randomInt = rng.nextInt();
double randomDouble = rng.nextDouble();

(2)使用 RandomGeneratorFactory 动态选择算法

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)

RandomGenerator rng = new L64X128MixRandom(12345L); // 固定种子

4. 不同 PRNG 算法的比较

算法周期长度性能适用场景
L32X64MixRandom2³²游戏、简单模拟
L64X128MixRandom2⁶⁴中等通用随机数生成
Xoroshiro128PlusPlus2¹²⁸ - 1极快低延迟应用
Xoshiro256PlusPlus2²⁵⁶ - 1科学计算、加密

5. 最佳实践

  1. 选择适合的算法

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

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

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

  3. 线程安全jdk.random 的 PRNG 默认不是线程安全的,多线程环境下应使用 ThreadLocalRandom 或同步访问。


6. 示例:蒙特卡洛模拟

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

http://www.dtcms.com/a/499305.html

相关文章:

  • 如何做网站接口关于电子商务网站建设的现状
  • 网站栏目设计内容谷歌在线浏览器入口
  • 聊聊 Unity(小白专享、C# 小程序 之 自动更新)
  • 截取网站流量dede购物网站
  • 某Boss直聘数据获取
  • Spring Boot 3零基础教程,WEB 开发 默认欢迎页 笔记28
  • Redis极简入门 整合springboot
  • 漫蛙漫画官网入口 - 免费漫画在线看|防走失页入口
  • MySQL中的约束详解
  • 服务流程企业网站东莞市建设安监监督网站
  • leetcode 206. 反转链表 python
  • 【C语言】自定义类型(附源码与图片分析)
  • 用户头像文件存储功能是如何实现的?
  • 网站设计大概在什么价位渠道销售
  • C++竞赛递推算法-斐波那契数列常见题型与例题详解
  • 单元测试-例子
  • 网站顶部素材山西制作网站
  • PHP 高效 JSON 库 JsonMachine
  • 网站建设内部因素百度站长平台有哪些功能
  • Linux内核IPoIB驱动深度解析:在InfiniBand上跑IP网络的高性能之道
  • 275TOPS算力边缘计算盒子的价值洞察与市场定位---视程空间
  • 对话 MoonBit 张宏波:为 AI 重构编程语言
  • QGIS制图专题4:缓冲区分析与服务半径专题图制作
  • IP 资源会枯竭吗?IPv6 能解决代理市场的矛盾吗?
  • 物联网运维中的边缘计算任务调度优化策略
  • TensorFlow2 Python深度学习 - 循环神经网络(LSTM)示例
  • C++第二十三课:猜数字游戏等练习
  • 河南省建设厅网站中州杯企业网站推广怎么做
  • 【数论】最大公因数 (gcd) 与最小公倍数 (lcm)
  • rocky linux MariaDB安装过程