【发布时间】:2023-03-23 16:19:01
【问题描述】:
我们需要使用种子对 ArrayList 进行洗牌
代码是这样的:
List<String> tempList = new ArrayList<>()
//code to populdate the tempList
Random rng = new Random(2018);
Collections.shuffle(tempList, rng);
附:我们提供静态随机种子的原因是为了确保它在洗牌后始终产生相同的结果。
我们观察到的是,开发机器 (Mac) 上的洗牌结果与我们的构建机器 (Linux) 上的洗牌结果不同
我想知道这个方法本身是否依赖于平台?
JDK 详细信息 Mac 已开启:
Java(TM) SE Runtime Environment (build 1.8.0_171-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)
构建机器(我需要更多时间来了解更多详细信息,因为我无权访问):
jdk1.8.0_162
【问题讨论】:
-
您是否使用不同的 JVM?还是甲骨文(Hotspot)的官方?哪个版本?您能否提供有关测试设置和机器的更多信息?
Random对象本身呢?尝试使用nextInt生成一些数字,看看序列是否也不同。 -
在不同的JVM上会不会不一样?我会找出版本详细信息并更新问题
-
可预测的改组的目的是什么?
-
它需要被洗牌,所以列表不是按字母顺序排列的。它需要可预测的原因是它在开发机器和构建机器上是相同的打乱顺序。
-
应该没有变化,即使 Java 版本不同。来自the docs:“为了保证这个属性,为类 Random 指定了特定的算法。为了 Java 代码的绝对可移植性,Java 实现必须使用此处为类 Random 显示的所有算法。”
标签: java random random-seed