Java中随机的不同数字

时间:2016-01-15 12:13:07

标签: java random numbers

我在Java中为非有向图生成随机边缘时遇到问题。问题与here完全相同,但我没有matlab的randperm函数。我尝试创建一个大小为v*(v-1)*0.5的列表,其中v是图中的多个顶点,并将其混洗。但是我试图用100万个顶点在图形中生成1亿条边。包含大约10e12条目的列表是一个真正的问题。所以我需要110e12之间的1亿个不同数字,并且不知道如何获取它们。

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的内存。