Java开发中随机数的多种获取办法

Java开发中随机数的多样获取途径

随机数的生成是常见的业务情境,例如摇号、抽奖等都需要用到随机数。在Java代码中,主要有三种生成随机数的方式,分别是Math.random、Random、ThreadLocalRandom,下面来分别进行说明:

1、Math.random

当在Java中调用Math.random()时,会返回一个取值范围在[0,1)区间内的双精度类型随机数。可以看到,通过这种方式获取到的随机数是小数,如果业务场景需要随机整数,就需要把这个随机小数放大若干倍后再取整,所以使用起来会有一定不便。

2、Random

查看Math.random的源码,能够发现该函数实际上调用了randomNumberGenerator的nextDouble方法:

public static double random() {
    return RandomNumberGeneratorHolder.randomNumberGenerator.nextDouble();
}

进一步查找randomNumberGenerator会发现,这个对象是Random类型的,并且它的实例是通过new Random()来获取的:

private static final class RandomNumberGeneratorHolder {
    static final Random randomNumberGenerator = new Random();
}

由此可见,Math.random的随机数实际上来自于Random。除了nextDouble方法之外,Random还提供了nextFloat、nextInt、nextLong等方法来生成对应类型的随机数。比如要生成指定范围的随机整数,可以通过nextInt(**)方法来实现。例如下面这段代码生成的随机整数取值区间是[0,100):

Random random = new Random();
int result = random.nextInt(100);

3、ThreadLocalRandom

虽然在大多数情况下Random已经能够满足需求,但是在多线程环境下,各个线程会竞争同一个随机种子,这就有可能因为抢占失败而进行自旋重试。
为了解决Random在多线程场景下性能降低的问题,Java提供了保证线程安全的ThreadLocalRandom。在多线程环境中,ThreadLocalRandom会为每个线程维护单独的随机种子,这样各个线程就可以各自使用自己的随机种子,避免了抢占失败的问题。
ThreadLocalRandom的使用方法很简单,仅需要下面两行代码就可以获取到取值区间为[0,100)的随机整数:

ThreadLocalRandom threadLocalRandom = ThreadLocalRandom.current();
threadLocalRandom.nextInt(100);
版权声明:程序员胖胖胖虎阿 发表于 2025年7月26日 下午8:36。
转载请注明:Java开发中随机数的多种获取办法 | 胖虎的工具箱-编程导航

相关文章

暂无评论

暂无评论...