java - java.util.Collections.shuffle 平台依赖吗?

标签 java random random-seed

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

Build Machine(我需要更多时间来了解更多详细信息,因为我没有访问权限):
jdk1.8.0_162

最佳答案

据我了解,您是在问这个 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);
    }
};
tio.run says它至少在“OpenJDK 8”和他们称为“JDK”的任何东西之间产生相同的输出。但这是一个非常小而无聊的样本。
The official Oracle docs不放心:

Randomly permute the specified list using the specified source of randomness. All permutations occur with equal likelihood assuming that the source of randomness is fair.

This implementation traverses the list backwards, from the last element up to the second, repeatedly swapping a randomly selected element into the "current position". Elements are randomly selected from the portion of the list that runs from the first element to the current position, inclusive. [Emphasis added.]


也就是说,Oracle 并没有声称每个实现都是这样工作的。他们甚至都懒得记录交换元素是“随机选择”的。
顺便说一句,我是在看到 Collections.shuffle 后才知道你的问题的二手 in U.S. voting system software正是这个假设:无论您使用什么 JDK,它的行为都是可重现的。我同意完全不清楚是否是这种情况。
(顺便说一下,C++ std::shuffle 不是这种情况。在那里,不同的库实现 can and do 对相同的输入给出不同的洗牌。)

关于java - java.util.Collections.shuffle 平台依赖吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51699095/

相关文章:

java - Java 源文件中的新行 : How to test for them using Character class?

java - 效率计数器不会重置

c# - 特殊随机数

c++ - 在 Xcode 8.3 上构建 C++ 正态分布随机数生成器

c++ - 使用较小的值和较高的值初始化 c/c++ 种子时的随机性如何?

python - 如何为 scikit-learn 播种随机数生成器?

java - gwt 自定义小部件包装方法

java - 在特定范围内生成Java中的十进制随机数?

c++ - 如何以安全便携的方式为随机数生成器播种?

java - Cookie 与 jsessionid url token 优先级