从JDK 18开始,RandomGenerator的默认算法即L32X64MixRandom(自17年起提供),每次调用时都会生成相同的数字.
jshell> java.util.random.RandomGenerator.getDefault().nextInt(100,999)
$10 ==> 526
jshell> java.util.random.RandomGenerator.getDefault().nextInt(100,999)
$11 ==> 526
jshell> java.util.random.RandomGenerator.of("L32X64MixRandom").nextInt(100, 999)
$14 ==> 526
jshell> java.util.random.RandomGenerator.of("L32X64MixRandom").nextInt(100, 999)
$15 ==> 526
javadoc也没有发出任何特别的警告:
返回指定原点(包含)和指定边界(独占)之间的伪随机 Select 的int值.
实施要求:
而包括传统算法在内的其他算法似乎具有可感知的随机性水平,例如.
jshell> java.util.random.RandomGenerator.of("Random").nextInt(100,999)
$7 ==> 451
jshell> java.util.random.RandomGenerator.of("Random").nextInt(100,999)
$8 ==> 633
jshell> java.util.random.RandomGenerator.of("L64X128MixRandom").nextInt(100, 999)
$12 ==> 570
jshell> java.util.random.RandomGenerator.of("L64X128MixRandom").nextInt(100, 999)
$13 ==> 844
这种默认 Select 的决定论水平有什么原因吗?
编辑:行为wrt.流非常相似,初始值似乎总是相同的
jshell> java.util.random.RandomGenerator.getDefault().ints(100,999).limit(5).toArray()
$22 ==> int[5] { 526, 860, 258, 558, 820 }
jshell> java.util.random.RandomGenerator.getDefault().ints(100,999).limit(5).toArray()
$23 ==> int[5] { 526, 866, 448, 654, 684 }