java.util.Collections.shuffle是否依赖于平台



我们需要使用种子打乱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

据我所知,您在问这个Java程序是否保证在现有的每个Java实现上打印bcdea

import java.util.Random;
import java.util.ArrayList;
import java.util.Collections;
class Main {
public static void main(String[] args) {
Random rng = new Random(42);
ArrayList<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
Collections.shuffle(list, rng);
for (String s : list) System.out.print(s);
}
};

tio.run说它至少在"0"one_answers"0"之间产生相同的输出;OpenJDK 8";不管是什么,他们都称之为";JDK";。但这是一个非常小和无聊的样本。

Oracle的官方文档并不令人放心:

使用指定的随机性源随机排列指定的列表。假设随机性的来源是公平的,所有排列都以相等的可能性发生。

这个实现向后遍历列表,从最后一个元素到第二个元素,重复地将随机选择的元素交换到";当前位置";。元素是从列表中从第一个元素到当前位置(包括第一个元素(的部分中随机选择的。[增加了重点。]

也就是说,Oracle并没有声称每个实现都是这样工作的;他们甚至都懒得记录交换后的元素是"什么";随机选择">

顺便说一句,我是在看到美国投票系统软件中使用的Collections.shuffle后得出你的问题的,它正是基于这样的假设:无论你使用什么JDK,它的行为都是可复制的。我同意目前还不清楚情况是否如此。

(顺便说一句,C++std::shuffle的情况并非如此。在那里,不同的库实现可以和do为相同的输入提供不同的混洗。(

最新更新