Java生成随机数的4种方式,以后就用它了!(5)

简介: Java生成随机数的4种方式,以后就用它了!(5)

② 实现原理


ThreadLocalRandom 的实现原理和 ThreadLocal 类似,它是让每个线程持有自己的本地种子,该种子在生成随机数时候才会被初始化,实现源码如下:


public int nextInt(int bound) {
    // 参数效验
    if (bound <= 0)
        thrownew IllegalArgumentException(BadBound);
    // 根据当前线程中种子计算新种子
    int r = mix32(nextSeed());
    int m = bound - 1;
    // 根据新种子和 bound 计算随机数
    if ((bound & m) == 0) // power of two
        r &= m;
    else { // reject over-represented candidates
        for (int u = r >>> 1;
             u + m - (r = u % bound) < 0;
             u = mix32(nextSeed()) >>> 1)
            ;
    }
    return r;
}
final long nextSeed() {
    Thread t; long r; // read and update per-thread seed
    // 获取当前线程中 threadLocalRandomSeed 变量,然后在种子的基础上累加 GAMMA 值作为新种子
    // 再使用 UNSAFE.putLong 将新种子存放到当前线程的 threadLocalRandomSeed 变量中
    UNSAFE.putLong(t = Thread.currentThread(), SEED,
                   r = UNSAFE.getLong(t, SEED) + GAMMA); 
    return r;
}


③ 优缺点分析


ThreadLocalRandom 结合了 Random 和 ThreadLocal 类,并被隔离在当前线程中。因此它通过避免竞争操作种子数,从而在多线程运行的环境中实现了更好的性能,而且也保证了它的线程安全


另外,不同于 Random, ThreadLocalRandom 明确不支持设置随机种子。它重写了 Random 的setSeed(long seed) 方法并直接抛出了 UnsupportedOperationException 异常,因此降低了多个线程出现随机数重复的可能性


源码如下:


public void setSeed(long seed) {
    // only allow call from super() constructor
    if (initialized)
        thrownew UnsupportedOperationException();
}


只要程序中调用了 setSeed() 方法就会抛出 UnsupportedOperationException 异常,如下图所示:


image.png

相关文章
|
5月前
|
Java
Java产生随机数
Java产生随机数
66 0
|
Java 数据安全/隐私保护 索引
使用Java中的随机函数生成随机数
在Java编程中,我们经常需要生成随机数来模拟各种情况或者作为密码等敏感信息的一部分。Java提供了一个内置的随机函数库,可以轻松地生成各种类型的随机数。本篇博客将介绍如何使用Java中的随机函数来生成随机数。
228 1
|
2月前
|
Java
Java系类 之 生成随机数(random()和Random类)
这篇文章介绍了Java中生成随机数的两种方法:使用`Math.random()`方法和`Random`类的实例方法,并提供了示例代码展示如何使用这些方法生成特定范围或特定条件下的随机数。
|
5月前
|
Java
java_键盘录入、随机数
本文介绍了Java中键盘录入和Random类的使用。键盘录入用于从用户那里获取数据,通过导入`java.util.Scanner`,创建`Scanner`对象,调用`nextInt()`或`nextDouble()`读取整数和小数,`next()`读取字符串。Random类用于生成随机整数,导入该类后创建对象,调用`nextInt(int bound)`生成[0, bound-1]范围内的随机数。在JDK17及以上版本,可以使用`nextInt(int start, int end)`生成[start, end)范围的随机数。常见应用包括猜数字游戏和随机点名。
42 0
|
4月前
|
存储 安全 Java
Java生成随机数的代码和方法
Java生成随机数的代码和方法
74 6
|
4月前
|
算法 安全 Java
什么是Java伪随机数,基础打牢。 #程序员 #Java #编程
什么是Java伪随机数,基础打牢。 #程序员 #Java #编程
27 0
|
5月前
|
存储 Java
35、Java 中的 Math 类、Random 随机数、UUID、格式化字符串或数字、字符串和数字的相互转换、高精度计算、BigDecimal、计算机中的浮点数都是近似值
35、Java 中的 Math 类、Random 随机数、UUID、格式化字符串或数字、字符串和数字的相互转换、高精度计算、BigDecimal、计算机中的浮点数都是近似值
78 0
|
11月前
|
安全 Java 数据安全/隐私保护
java random随机数的用法
java random随机数的用法
|
5月前
|
Java API
Java的Math.random获取区间随机数
Java的Math.random获取区间随机数