【发布时间】: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