【问题标题】:Java Collections.shuffle() weird behaviour [closed]Java Collections.shuffle() 奇怪的行为
【发布时间】:2018-08-15 16:38:39
【问题描述】:

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

我有一个大的长数字数组列表。它包含大约 200k 个按升序排列的数字。这些数字总是不同的;它们不一定是连续的,但它们中的某些组通常是连续的。

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

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

不过,我的结果有点奇怪。 我提取的许多随机多头似乎彼此非常接近,即使不是连续的。例如,我得到:

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

这绝对不是随机的:/

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

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

我错过了什么吗?

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

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

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

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

【问题讨论】:

  • 为什么?我需要按升序订购我的样品。这不应该影响它包含从源列表中随机提取的数字这一事实。
  • 听起来像一个真实的Heisenbug(但更可能是误解)。没有您的代码,人们就无法回答您的问题。
  • @AndreaRossi 您发布的代码看起来不错 - 所以问题很可能出在您未发布的代码中。您需要创建一个minimal reproducible example
  • 如果您没有对随机性进行任何测试,那么“这看起来并不绝对随机”之类的陈述毫无意义。更多详情可以查看softwareengineering.stackexchange.com/questions/147134/…

标签: java random collections long-integer shuffle


【解决方案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 ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-06
    • 2017-09-27
    • 2015-12-04
    • 2012-02-16
    • 2021-09-28
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多