Java基础:Java 各种随机数生成方式

汇总 Java 的各种随机数生成方式,而不仅只有 java.util.Random 。

Math.random()

Math.random() 静态方法:产生的随机数是 0 - 1 之间的一个 double 值,即 0 <= random <= 1

内部实现:首次调用此方法时,调用java.util.Random() 创建一个新的伪随机数生成器,后续调用此方法都将使用此伪随机数生成器。此方法已正确同步,以允许多个线程正确使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
// Math 类
public static double random() {
return RandomNumberGeneratorHolder.randomNumberGenerator.nextDouble();
}
private static final class RandomNumberGeneratorHolder {
static final Random randomNumberGenerator = new Random();
}

// Random 类的方法
private static final double DOUBLE_UNIT = 0x1.0p-53;
public double nextDouble() {
return (((long)(next(26)) << 27) + next(27)) * DOUBLE_UNIT;
}

java.util.Random

Random 基本算法:linear congruential pseudorandom number generator (LGC) 线性同余法伪随机数生成器。

Random 的实例是线程安全的,但是,在线程之间并发使用同一 Random 实例可能会引起争用并因此导致性能下降。 考虑改用 java.util.concurrent.ThreadLocalRandom

Random 的实例不是加密安全的。 考虑改为使用 link java.security.SecureRandom来获取加密安全的伪随机数生成器,以供对安全敏感的应用程序使用。

1
2
Random random = new Random();
random.nexInt();

Random类提供的方法:API

  • nextBoolean() :返回均匀分布的 true 或者 false
  • nextBytes(byte[] bytes):生成随机字节并将其放入用户提供的字节数组中,产生的随机字节数等于字节数组的长度。
  • nextDouble():返回 0.0 到 1.0 之间的均匀分布的 double
  • nextFloat():返回 0.0 到 1.0 之间的均匀分布的 float
  • nextGaussian():返回 0.0 到 1.0 之间的高斯分布(即正态分布)的 double
  • nextInt():返回均匀分布的 int
  • nextInt(int n):返回 0 到 n 之间的均匀分布的 int (包括 0,不包括 n)
  • nextLong():返回均匀分布的 long
  • setSeed(long seed):设置种子

ThreadLocalRandom

ThreadLocalRandom 是 Java 1.7 提供的,继承 java.util.Random 类。

ThreadLocalRandom:创建线程隔离的随机数生成器,在线程并发环境中,每个线程都有一个独立的随机数生成器。

在并发程序中使用 ThreadLocalRandom 而不是共享的 Random对象,能够解决线程并发开销和争用,效率更高。

当多个任务(例如每个 ForkJoinTask)在线程池中并行使用随机数时,使用ThreadLocalRandom 特别合适。

ThreadLocalRandom 通常的使用方式是:

1
2
ThreadLocalRandom.current().nextX(...)
// X 可以是 Int, Long 等等

SecureRandom

SecureRandom:返回实现指定的随机数生成器(RNG)算法的SecureRandom对象。

1
2
3
// 获取 SecureRandom 实例
// algorithm 是随机数生成算法:https://docs.oracle.com/javase/7/docs/technotes/guides/security/StandardNames.html#SecureRandom
public static SecureRandom getInstance(String algorithm){........}

创建实例

1
2
3
4
5
6
// 使用默认的 SHA1PRNG 算法
SecureRandom secureRandom = new SecureRandom();
// 同上
SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
// 指定算法,又指定提供算法的包程序
SecureRandom random = SecureRandom.getInstance("SHA1PRNG", "SUN");

使用

1
2
SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
secureRandom.nextInt();

RandomStringUtils

RandomStringUtils 来自 org.apache.commons.lang3 包,生产随机的字符串。内部都是可直接调用的静态方法,方法的第一个传参是 count,指定随机字符串的长度。

1
2
3
4
5
6
7
8
9
10
public static void main(String[] args) {
// jzIviuDDPb, 随机字母
System.out.println(RandomStringUtils.randomAlphabetic(10));
// YO2loyBu7n, 随机字母+数字
System.out.println(RandomStringUtils.randomAlphanumeric(10));
//$kVb&55^*|, 随机字母+数字+特殊字符
System.out.println(RandomStringUtils.randomAscii(10));
// 3105127163, 随机数字字符串
System.out.println(RandomStringUtils.randomNumeric(10));
}

Java基础:Java 各种随机数生成方式

http://blog.gxitsky.com/2020/09/22/Java-jdk-16-random-method/

作者

光星

发布于

2020-09-22

更新于

2022-06-17

许可协议

评论