我正在经历一些奇怪的事情。
我有一个很大的长数列表。它按升序包含大约20万个数字。这些数字总是截然不同的;它们不一定是连续的,但它们中的一些通常是连续的。
我想从这个列表中提取一个5k的已排序样本,所以基本上这是我的方法:
java.util.Collections.shuffle(list);
list
但我的结果有些奇怪。 如果不是连续的话,我提取的许多随机长片看起来很可疑。例如,我得到了:
...
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));
}
答案 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 ...