java-RandomGenerator的默认算法(L32X64MixRandom)每次生成相同的数字
发布时间:2022-05-10 23:50:42 373
相关标签: # 移动端
从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也没有发出任何特别的警告:
返回指定原点(包含)和指定边界(独占)之间的伪随机选择的int值。
实现要求:默认实现检查origin和bound是否为正整数。然后调用nextInt(),将结果限制为大于或等于原点,小于界限。如果bound是二的幂,那么限制就是一个简单的掩蔽操作。否则,通过调用nextInt()重新计算结果,直到结果大于或等于原点且小于界限。
而包括传统算法在内的其他算法似乎具有可感知的随机性水平,例如。
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
这种默认选择的决定论水平有什么原因吗?
编辑:行为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 }
特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报