Java Collections.shuffle()奇怪的行为

我正在经历一些奇怪的事情。

我有一个很大的长数列表。 它按升序包含大约20万个数字。 这些数字总是截然不同的; 它们不一定是连续的,但它们中的一些通常是连续的。

我想从这个列表中提取一个5k的已排序样本,所以基本上这是我的方法:

  • 我调用java.util.Collections.shuffle(list);
  • 我从现在洗牌的list提取出前5k个元素
  • 我按升序对提取的元素进行排序

不过,我的结果有些奇怪。 如果不是连续的话,我提取的很多随机长片看起来很可疑。 例如,我得到了:

 ... 38414931, 38414932, 38414935, 38414937, 38414938, 38414939, 38414941, ... 

这绝对不是随机的:/

有一个更奇怪的事情。 在调试时,我尝试将初始list和提取的样本写入文件以进行比较。 如果我这样做,我的问题似乎消失了,我提取的Longs看起来像是正确的随机数。

当然,我已经重复了很多次,每次我都经历过这两种行为。

我错过了什么吗?

编辑:这是我正在使用的代码:

 List allNumbers = ; 

—>如果在这里我将allNumbers写入文件,它似乎工作正常

 Collections.shuffle(allNumbers); HashSet randomNumbers = new HashSet(); for (int i = 0; i < 5000; i++) { randomNumbers.add(allNumbers.get(i)); } 

这是一个最小的,完整的,可validation的示例 ,可以按预期输出一些随机的,增加的数字。 请注意,我的代码与您的代码相同,但输入部分除外。 所以要么你的问题出现在你尚未显示的代码中,要么即使有连续数字的序列,输出仍然很好,即使是随机分布也是如此。

 public static void main(String[] args) { List allNumbers = new ArrayList<>(); for (long i = 0; i < 2_000; i++) allNumbers.add(i); Collections.shuffle(allNumbers); Set randomNumbers = new HashSet<>(); for (int i = 0; i < 50; i++) randomNumbers.add(allNumbers.get(i)); randomNumbers.stream().sorted().forEach(n -> System.out.print(n + " ")); } 

输出示例:

30 149 233 255 301 357 361 391 412 413 423 480 481 ……