java - 是否可以保证 java.util.Collections.shuffle() 背后的算法在未来的 Java 版本中保持不变?

标签 java random shuffle

在未来的 java 版本中,以下程序是否保证生成具有相同内容和顺序的列表?

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Random;

public class Test {
  public static void main(String[] args) {
    List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C", "D"));
    Collections.shuffle(list, new Random(42));
  }
}

java.util.Random 类的 javadoc 保证如果在所有 future 的 java 版本中使用相同的种子初始化它将始终返回相同的随机数。

但是 java.util.Collections.shuffle() 实用函数背后的算法是否有任何保证?这个实用函数的 Javadoc 对此没有任何说明。

我需要这种保证,因为我想确保持久化数据不会对 future 的任何 Java 版本无用。

最佳答案

如您所说,没有明确的保证。

另一方面,单独的 Collections.shuffle(List,Random) 的存在表明其意图是当使用 调用时,此方法将始终返回相同的顺序处于相同状态的随机。 (例如,这对于创建可重复的测试很有用。)

所以这是一个灰色地带。

但是如果核心功能依赖于它并且你想绝对确定,你可以实现 Fisher-Yates algorithm (或者更确切地说,更有效的 Durstenfeld 算法)你自己,这很简单。它非常简单,绝对不值得冒(可能很小的)Collections.shuffle() 将来会发生变化的风险。

关于java - 是否可以保证 java.util.Collections.shuffle() 背后的算法在未来的 Java 版本中保持不变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31720119/

相关文章:

java - Java中的单精度/ double 是什么?

Grails:如何生成对人类友好的、确保唯一的随机数

输出字母(A 到 E)的 Java Random 类

c - 在 XMM 中反转两个压缩 double 时,对 SHUFPD 或 PSHUFD 有何偏好?

java - 是否可以设置 Eclipse 代码完成以首先显示第一方类

java - S40系列的jar文件

java - 在列表中查找重复的字符串并使它们唯一

r - 将局部环境的随机性与全局 R 过程隔离

tensorflow - 如何使用 TensorFlow 打乱整个数据集?

模板中的django shuffle