Din*_*ong 5 java random random-seed
我们需要使用种子来混洗ArrayList
代码类似于:
List<String> tempList = new ArrayList<>()
//code to populdate the tempList
Random rng = new Random(2018);
Collections.shuffle(tempList, rng);
Run Code Online (Sandbox Code Playgroud)
PS我们提供静态随机种子的原因是为了确保它在洗牌后总是产生相同的结果.
我们观察到的是,在我们的构建机器(Linux)上的dev机器(Mac)上的混洗结果是不同的
我想知道这个方法本身是否依赖平台?
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)
Run Code Online (Sandbox Code Playgroud)
构建机器(由于我没有访问权限,我需要更多时间来查找更多详细信息):
jdk1.8.0_162
Run Code Online (Sandbox Code Playgroud)
据我了解,您是在问这个 Java 程序是否能保证bcdea
在现有的每个 Java 实现上打印。
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);
}
};
Run Code Online (Sandbox Code Playgroud)
tio.run 表示,它至少在“OpenJDK 8”和“JDK”之间产生相同的输出。但这是一个非常小且无聊的样本。
Oracle 官方文档并不令人放心:
使用指定的随机源随机排列指定的列表。假设随机性来源是公平的,所有排列都以相同的可能性发生。
此实现向后遍历列表,从最后一个元素到第二个元素,反复将随机选择的元素交换到“当前位置”。元素是从列表中从第一个元素到当前位置(含)的部分中随机选择的。[强调。]
也就是说,Oracle 并不声称每个实现都如此。他们甚至懒得记录交换元素是如何“随机选择”的。
顺便说一句,在看到美国投票系统软件中Collections.shuffle
使用的软件后,我提出了你的问题,正是基于这样的假设:无论你使用什么 JDK,它的行为都是可重现的。我同意,目前还不清楚情况是否如此。
(顺便说一句,C++ 的情况并非如此std::shuffle
。在那里,不同的库实现可以并且确实为相同的输入提供不同的洗牌。)