java random


Random采用了(Linear Congruential Generator)线性同余算法(n*i + m)%l进行伪随机变换,seed为基数加当前nano时间戳。

SecureRandom采用更复杂的 SHA1PRAP算法,并且在初始化时,通过系统的properties变量、temp文件夹下文件大小,内存剩余,本地ip地址等系统变量的sha1散列值作为seed。


Random是可预测的随机函数。即只要输入的seed一样,则结果是一致的,所以只要知道了seed,结果就是可预测的。例如:

Random r1 = new Random(1);

Random r2 = new Random(1);

r1.nextInt() == r2.nextInt()


SecureRandom不可预测,例如:

SecureRandom r1 = new SecureRandom();

SecureRandom r2 = new SecureRandom();

byte[] b1 = new byte[10];

r1.nextBytes(b1);

byte[] b2 = new byte[10;

r2.nextBytes(b2);

b1 != b2;


对于RFC标准定义的不可预测的强随机数,可采用系统中cpu消耗,线程切换时间,用户鼠标点击动作,磁盘文件大小等不可预测数据作为seed进行随机化计算。


SecureRandom比Random更安全。假设某网站通过Random随机化session串,hacker只需要获取几个session串后,即可推论出以后的随机session串值。


UUID是基于SecureRandom产生的随机串生成。

Java 的 `Random` 类是用于生成随机数的工具类,以下是其使用指南示例: ### 基础入门:创建随机数 #### 快速上手 可以创建 `Random` 实例,然后使用其方法生成不同类型的随机数。示例代码如下: ```java import java.util.Random; public class RandomExample { public static void main(String[] args) { // 创建Random实例 Random random = new Random(); // 生成0到9的随机整数 int num = random.nextInt(10); // 生成[0,1)之间的随机小数 double decimal = random.nextDouble(); // 生成随机布尔值 boolean flag = random.nextBoolean(); System.out.println("随机整数: " + num); System.out.println("随机小数: " + decimal); System.out.println("随机布尔值: " + flag); } } ``` #### 生成指定范围随机数 可以通过一定的数学变换生成指定范围的随机数。示例代码如下: ```java import java.util.Random; public class RandomRangeExample { public static void main(String[] args) { Random random = new Random(); // 生成[5,15)范围的随机数 int rangeNum = 5 + random.nextInt(10); // 生成[20,30]闭区间随机数 int closedRange = 20 + random.nextInt(11); // 生成1到100的随机偶数 int evenNum = 2 * (1 + random.nextInt(50)); System.out.println("[5,15)范围的随机数: " + rangeNum); System.out.println("[20,30]闭区间随机数: " + closedRange); System.out.println("1到100的随机偶数: " + evenNum); } } ``` ### 核心原理:种子与算法 #### 种子机制揭秘 使用固定种子创建 `Random` 对象,会生成可预测的随机序列。示例代码如下: ```java import java.util.Random; public class RandomSeedExample { public static void main(String[] args) { // 使用固定种子 Random seededRandom = new Random(12345L); // 生成可预测序列 System.out.println(seededRandom.nextInt(100)); System.out.println(seededRandom.nextInt(100)); } } ``` ### 其他常用方法 - `public int nextInt(int n)`:生成一个随机的 `int` 值,该值介于 `[0,n)` 的区间,也就是 0 到 n 之间的随机 `int` 值,包含 0 而不包含 n [^2]。 - `public void setSeed(long seed)`:重新设置 `Random` 对象中的种子数。设置完种子数以后的 `Random` 对象相同种子数使用 `new` 关键字创建出的 `Random` 对象相同 [^2]。 - `public float nextFloat()`:用于从该随机值生成器生成介于 0.0 1.0 之间的下一个伪随机浮点值 [^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值