Java Collections.shuffle()奇怪的行为

时间:2018-03-07 14:26:34

标签: java random collections long-integer shuffle

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

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

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

  • 我致电java.util.Collections.shuffle(list);
  • 我从现在改组的list
  • 中提取出前5k个元素
  • 我按升序对提取的元素进行排序

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

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

这看起来并不是随机的:/

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

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

我错过了什么吗?

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

List<Long> allNumbers = <getting my list>;

---&GT;如果在这里我将allNumbers写入文件,它似乎工作正常

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

1 个答案:

答案 0 :(得分:1)

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

public static void main(String[] args) {
  List<Long> allNumbers = new ArrayList<>();
  for (long i = 0; i < 2_000; i++) allNumbers.add(i);

  Collections.shuffle(allNumbers);
  Set<Long> 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 ...