Java 中Random(seed)方法

本文深入解析Java中的Random类,探讨如何使用单个long种子创建随机数生成器,解释种子与随机数之间的关系,以及内部实现机制如next(int)和setSeed()方法的作用。同时阐述伪随机数生成的概念及其应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public Random(long seed){}
    seed是种子,使用单个long种子创建一个新的随机数生成器。该种子是伪随机数生成器的内部状态的初始值,该生成器可通过方法next(int)维护。seed会做为生成随机数的某个条件,也是说seed和将要产生的随机数有某种关系!
       protected int next(int bits)
	将种子自动更新为(seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1)
	并返回(int)(seed >>> (48 - bits))
Random random = new Random(seed); 等同于 Random random = new Random();random.setSeed(seed);
	将种子自动更新为(seed ^ 0x5DEECE66DL) & ((1L << 48) - 1)
	setSeed只使用48位的给定种子,通常重写方法可能使用的是long,所以使用的是64位作为种子值。

*随机数:使用公式计算出来的数列,同样的初始值(又成为“种子”)会产生同样的数列,并且数列是循环的,虽然周期很长。
    

### JavaRandom 类的语法结构和用法 #### 1. **Random 类简介** `java.util.Random` 是 Java 提供的一个用于生成伪随机数的类。它可以通过多种方式生成不同类型的随机数值,例如 `int`, `long`, `float`, 和 `double` 等。 该类提供了多个构造函数以及丰富的实例方法来满足不同的需求[^2]。 --- #### 2. **Random 类的主要构造函数** - **无参构造函数** 创建一个新的随机数生成器对象并初始化种子值。 ```java Random random = new Random(); ``` - **带种子值的构造函数** 使用指定的种子值创建新的随机数生成器对象。相同的种子会生成相同的随机序列。 ```java long seedValue = 10L; Random randomWithSeed = new Random(seedValue); ``` --- #### 3. **常用方法及其功能** 以下是 `Random` 类的一些主要方法: - **生成整型随机数 (`nextInt`)** 返回一个介于 `[Integer.MIN_VALUE, Integer.MAX_VALUE)` 范围内的随机整数。如果提供参数,则返回范围在 `[0, bound)` 内的随机整数。 ```java int randomNumber = random.nextInt(); // 整个范围内随机 int boundedNumber = random.nextInt(10); // [0, 10) 范围内随机 ``` - **生成浮点型随机数 (`nextFloat`)** 返回一个介于 `[0.0f, 1.0f)` 范围内的单精度浮点数。 ```java float floatValue = random.nextFloat(); ``` - **生成双精度随机数 (`nextDouble`)** 返回一个介于 `[0.0d, 1.0d)` 范围内的双精度浮点数。 ```java double doubleValue = random.nextDouble(); ``` - **生成布尔值 (`nextBoolean`)** 随机返回 `true` 或 `false`。 ```java boolean boolValue = random.nextBoolean(); ``` - **生成高斯分布随机数 (`nextGaussian`)** 返回服从标准正态分布(均值为 0,标准差为 1)的双精度浮点数。 ```java double gaussianValue = random.nextGaussian(); ``` - **生成长整型随机数 (`nextLong`)** 返回一个任意大小的随机长整数。 ```java long longValue = random.nextLong(); ``` --- #### 4. **示例代码** 以下是一个完整的例子,展示如何使用 `Random` 类的不同方法: ```java import java.util.Random; public class RandomExample { public static void main(String[] args) { Random random = new Random(); // 生成随机整数 int randomInt = random.nextInt(100); // [0, 100) System.out.println("Random Int: " + randomInt); // 生成随机浮点数 float randomFloat = random.nextFloat(); // [0.0f, 1.0f) System.out.println("Random Float: " + randomFloat); // 生成随机双精度数 double randomDouble = random.nextDouble(); // [0.0d, 1.0d) System.out.println("Random Double: " + randomDouble); // 生成随机布尔值 boolean randomBool = random.nextBoolean(); System.out.println("Random Boolean: " + randomBool); // 生成高斯分布随机数 double gaussianValue = random.nextGaussian(); System.out.println("Gaussian Value: " + gaussianValue); // 带种子值的例子 Random seededRandom = new Random(10L); int fixedRandomInt = seededRandom.nextInt(100); System.out.println("Fixed Seed Random Int: " + fixedRandomInt); } } ``` --- #### 5. **注意事项** - 如果需要线程安全的随机数生成器,可以考虑使用 `ThreadLocalRandom` 替代 `Random`[^2]。 - 当前实现基于线性同余算法,因此其产生的随机数实际上是伪随机数。 --- 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值