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

【Java零碎知识点】----- java.util.Random 与 Math.random()

一、java.util.Random:面向对象的随机数生成器

1.1 基本用法

Randomjava.util 包中的一个类,用于生成伪随机数。它提供了丰富的 API,支持多种数据类型的随机值生成。

import java.util.Random;Random rand = new Random();int i = rand.nextInt();           // 任意 int 范围内的整数
int j = rand.nextInt(100);        // [0, 100) 的整数(0 到 99)
long l = rand.nextLong();         // 随机 long
float f = rand.nextFloat();       // [0.0f, 1.0f) 的 float
double d = rand.nextDouble();     // [0.0, 1.0) 的 double
boolean b = rand.nextBoolean();   // true 或 false

1.2 种子(Seed)机制

Random 的核心特性之一是可重现性,这依赖于“种子(seed)”机制。

  • 构造方法:
    • new Random():使用当前系统时间(纳秒)作为默认种子。
    • new Random(long seed):使用指定的长整型值作为种子。
Random r1 = new Random(123);
Random r2 = new Random(123);System.out.println(r1.nextInt()); // 例如:-1193959466
System.out.println(r2.nextInt()); // 同样:-1193959466

关键点:只要种子相同,Random 实例生成的随机数序列就完全一致。这是“伪随机数生成器(PRNG)”的本质——确定性算法 + 初始状态 = 可预测序列。

这一特性在单元测试、算法调试、游戏关卡复现等场景中极为有用。

1.3 内部实现简析

Random 内部使用 线性同余生成器(Linear Congruential Generator, LCG) 算法(具体为 java.util.Random 使用的是 48 位 LCG 变种)。

  • 每次调用 nextInt() 等方法时,内部状态(一个 48 位的种子)会按固定公式更新。
  • 输出值由该状态的高位或低位截取而来。
  • 算法简单、速度快,但周期有限(约 2^48),且不具备密码学安全性

1.4 线程安全性

Random 不是线程安全的

  • 多个线程共享同一个 Random 实例时,内部状态可能被并发修改,导致:
    • 生成重复值;
    • 序列混乱;
    • 极端情况下状态损坏。

虽然某些 JVM 实现中 nextInt() 等方法加了 synchronized(如早期 HotSpot),但官方文档明确指出:不应依赖其线程安全性

正确做法

  • 每个线程使用自己的 Random 实例;
  • 或改用 ThreadLocalRandom(但本文聚焦于 RandomMath.random())。

1.5 性能特点

  • 初始化快;
  • 单次调用开销极低(纳秒级);
  • 适合高频、单线程场景。

二、Math.random():静态便捷方法

2.1 基本用法

Math.random()java.lang.Math 类中的一个静态方法,返回一个 double 类型的值:

double d = Math.random(); // 返回 [0.0, 1.0) 范围内的 double

若需生成整数,需手动转换:

// 生成 [0, 100) 的整数
int num = (int) (Math.random() * 100);// 生成 [1, 10] 的整数
int dice = (int) (Math.random() * 10) + 1;

2.2 内部实现机制

很多人误以为 Math.random() 是“原生”的随机函数,其实它底层完全依赖 java.util.Random

查看 JDK 源码(以 OpenJDK 为例):

private static final class RandomNumberGeneratorHolder {static final Random randomNumberGenerator = new Random();
}public static double random() {return RandomNumberGeneratorHolder.randomNumberGenerator.nextDouble();
}
  • Math.random() 内部持有一个 静态的、单例的 Random 实例
  • 首次调用时初始化该实例;
  • 后续所有调用都复用这个实例。

三、对比总结:Random vs Math.random()

特性java.util.RandomMath.random()
返回类型支持 int、long、float、double、boolean仅 double
指定范围直接支持(如 nextInt(100)需手动计算((int)(Math.random()*100)
种子控制✅ 支持(可重现序列)❌ 不支持
线程安全❌ 非线程安全✅ 线程安全(内部同步)
性能(单线程)⚡ 极快快(首次有初始化开销)
性能(多线程)快(若每个线程独立实例)❌ 慢(锁竞争)
使用复杂度稍高(需创建对象)极简(直接调用)
适用场景通用、测试、需要多种类型或种子控制简单脚本、教学、低频单线程随机
http://www.dtcms.com/a/569093.html

相关文章:

  • 补充内容:YOLOv5损失函数解析+代码阅读
  • 北仑网站建设培训学校游戏开发需要什么学历
  • 高端装备制造提速,紧固件标准化与智能化升级成为行业新焦点
  • 6项提高电机制造质量的电气测试方案
  • 09_FastMCP 2.x 中文文档之FastMCP高级功能服务器组成详解
  • 工业之“眼”的进化:基于MEMS扫描的主动式3D视觉如何驱动柔性制造
  • 基于管理会计的制造企业运营优化虚拟仿真实验
  • 工业制造领域的ODM、OEM、EMS、JDM、CM、OBM都是啥
  • 建设网站要用什么软件.net程序员网站开发工程师
  • day07(11.4)——leetcode面试经典150
  • java源代码、字节码、jvm、jit、aot的关系
  • JVM 垃圾收集器介绍
  • springcloud:理解springsecurity安全架构与认证链路(二)RBAC 权限模型与数据库设计
  • 自适应网站建设电话网站dns错误
  • 上海网站建设上海迈歌玉树营销网站建设哪家好
  • [5-01-01].第03节:JVM启航 - JVM架构
  • 2024CISCN ezjava复现
  • Cursor 项目实战:AI播客策划助手(二)—— 多轮交互打磨播客文案的技术实现与实践
  • JavaScript的Web APIs 入门到实战(day2):事件监听与交互实现,轻松实现网页交互效果(附练习巩固)
  • 网站建设难么深圳网站制作服
  • 使用vue Template version: 1.3.1时, 设置的env无法正常读取
  • HOT100题打卡第28天——位运算
  • EasyOCR的模型放在了哪里
  • 18、【Ubuntu】【远程开发】技术方案分析:私网ip掩码
  • 做购物网站哪个cms好用企业支付的网站开发费如何入帐
  • 怎样将自己做的网站给别人看微信小程序网站建设
  • 【软考】信息系统项目管理师-质量管理论文范文
  • (T24) 跨时钟域SI->Q path的latch选型
  • 学习记录记录记录记录
  • 【JAVA】基础(一)