返回

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 }
特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(1)
按点赞数排序
用户头像