我在Java中为非有向图生成随机边缘时遇到问题。问题与here完全相同,但我没有matlab的randperm
函数。我尝试创建一个大小为v*(v-1)*0.5
的列表,其中v
是图中的多个顶点,并将其混洗。但是我试图用100万个顶点在图形中生成1亿条边。包含大约10e12
条目的列表是一个真正的问题。所以我需要1
和10e12
之间的1亿个不同数字,并且不知道如何获取它们。
答案 0 :(得分:0)
如果您想要一个没有重复的可能值的小子集,则Set是更好的方法。这只需保留您之前看到的元素,以避免重复。
Set<Long> longs = new HashSet<>(100_000_000*10/7); // for a load factor of 0.5
Random rand = new Random();
for (int i = 0; i < 100_000_000; i++) {
Long l = Math.abs(rand.nextLong() % 1000_000_000_000L);
if (longs.add(l)) {
// new long
} else {
i--;
}
}
HashSet每个条目使用大量内存,因此更有效的解决方案是使用诸如HashLongSet的原始集,1亿个长度应使用1到2 GB的内存。