本文是对官方文档(https://openjdk.org/jeps/356)的概括总结,更详细的内容请看官方文档的不完全翻译https://blog.csdn.net/weixin_38833041/article/details/125464143
简介
为伪随机数生成器 (PRNG) 提供新的接口类型和实现,包括可跳转的 PRNG 和另一类可拆分的 PRNG 算法 (LXM)。
新特点
提供了一个新接口 RandomGenerator
它为所有现有的和新的 PRNG 提供了一个统一的 API。 RandomGenerators 提供名为 ints、longs、doubles、nextBoolean、nextInt、nextLong、nextDouble 和 nextFloat 的方法,以及它们当前的所有参数的变化。从而更容易在应用程序中互换使用各种 PRNG 算法。例如:
static void testRandomGenerator (RandomGenerator randomGenerator){
IntStream ints = randomGenerator.ints(50,0,10);
int[] randoms = ints.toArray();
for (int i:randoms) {
System.out.println(i);
}
System.out.println("random count = "+randoms.length);
}
public static void main(String[] args) {
testRandomGenerator(new Random());
testRandomGenerator(new SplittableRandom());
testRandomGenerator(ThreadLocalRandom.current());
}
提供了一个新类 RandomGeneratorFactory
它用于定位和构造 RandomGenerator 实现的实例。
static void testRandomGeneratorFactory(String randomGeneratorName){
RandomGeneratorFactory<RandomGenerator> factory = RandomGeneratorFactory.of(randomGeneratorName);
RandomGenerator generator = factory.create();
testRandomGenerator(generator);
}
public static void main(String[] args) {
testRandomGeneratorFactory("Random");
testRandomGeneratorFactory("L128X128MixRandom");
testRandomGeneratorFactory("Xoshiro256PlusPlus");
}
上述方法还支持如下LXM 系列 PRNG 算法:
- L32X64MixRandom
- L32X64StarStarRandom
- L64X128MixRandom
- L64X128StarStarRandom
- L64X256MixRandom
- L64X1024MixRandom
- L128X128MixRandom
- L128X256MixRandom
- L128X1024MixRandom
以及广泛使用的 PRNG 算法
- Xoshiro256PlusPlus
- Xoroshiro128PlusPlus
提供了四个新的专用 RandomGenerator 接口
- SplittableRandomGenerator 扩展了 RandomGenerator 并且还提供
名为 split 和 splits 的方法。 可拆分性允许用户从现有的 RandomGenerator 生成一个新的 RandomGenerator,这通常会产生统计上独立的结果。 - JumpableRandomGenerator 扩展了RandomGenerator 并且还提供
名为 jump 和 jumps 的方法。 可跳跃性允许用户跳到中等数量的抽签。 - LeapableRandomGenerator 扩展了 RandomGenerator 并且还提供
方法名为leap和leaps的方法。 可跳跃性允许用户跳过大量的抽签。 - ArbitrarilyJumpableRandomGenerator 扩展了 LeapableRandomGenerator 并且还提供了jump 和 jumps 的方法额外的变体,允许指定任意跳跃距离。