增强型伪随机数生成器为PRNG提供了新的接口类型和实现,包括可跳转的PRNG和一类额外的可拆分PRNG算法(LXM)。增强型伪随机数生成器由JEP 356并在JDK 17中作为正式功能提供。
要使用增强型伪随机数生成器,需要使用java.util.random
包中的新的接口和类。例如,我们可以使用RandomGenerator
接口来获取一个PRNG的实例,并且使用它来生成各种类型的随机数:
public static void generateRandomNumbers() {
RandomGenerator random = RandomGenerator.getDefault();
System.out.println("A random boolean: " + random.nextBoolean());
System.out.println("A random int: " + random.nextInt());
System.out.println("A random long: " + random.nextLong());
System.out.println("A random float: " + random.nextFloat());
System.out.println("A random double: " + random.nextDouble());
}
注意,RandomGenerator
接口提供了很多方便的方法来生成不同范围和分布的随机数,例如nextInt(int bound)
、nextLong(long bound)
、nextGaussian()
等。我们也可以使用RandomGeneratorFactory
类来获取不同的PRNG算法的实例,例如:
public static void useDifferentAlgorithms() {
RandomGenerator random1 = RandomGeneratorFactory.of("L32X64MixRandom");
RandomGenerator random2 = RandomGeneratorFactory.of("L64X128MixRandom");
RandomGenerator random3 = RandomGeneratorFactory.of("L128X256MixRandom");
System.out.println("Using L32X64MixRandom: " + random1.nextInt());
System.out.println("Using L64X128MixRandom: " + random2.nextInt());
System.out.println("Using L128X256MixRandom: " + random3.nextInt());
}
注意,RandomGeneratorFactory
类提供了很多方法来获取或者查询不同的PRNG算法,例如of(String name)
、all()
、preferred()
等。我们也可以使用JumpableRandomGenerator
接口或者SplittableRandomGenerator
接口来获取一个可跳转或者可拆分的PRNG实例,并且使用它们来生成不同的子生成器,例如:
public static void useJumpableOrSplittableGenerators() {
JumpableRandomGenerator jumpable = RandomGeneratorFactory.jumpable();
SplittableRandomGenerator splittable = RandomGeneratorFactory.splittable();
System.out.println("Using the original jumpable generator: " + jumpable.nextInt());
System.out.println("Using the original splittable generator: " + splittable.nextInt());
JumpableRandomGenerator jumped = jumpable.jump();
SplittableRandomGenerator splitted = splittable.split();
System.out.println("Using the jumped generator: " + jumped.nextInt());
System.out.println("Using the splitted generator: " + splitted.nextInt());
}
注意,JumpableRandomGenerator
接口和SplittableRandomGenerator
接口都继承自RandomGenerator
接口,并且提供了额外的方法来生成子生成器,例如jump()
、split()
等。这些子生成器可以用于并行计算或者其他场景。