【问题标题】:Random distinct numbers in JavaJava中的随机不同数字
【发布时间】:2016-04-21 00:48:42
【问题描述】:

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

【问题讨论】:

标签: java random numbers


【解决方案1】:

如果您想要一个没有重复的可能值的小子集,则 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 亿个 long 应该使用 1 到 2 GB 的内存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-07
    • 2019-07-26
    • 2015-01-31
    • 1970-01-01
    • 2019-09-24
    • 1970-01-01
    相关资源
    最近更新 更多