11、Java 17 新特性 - 增强型伪随机数生成器

增强型伪随机数生成器为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()等。这些子生成器可以用于并行计算或者其他场景。