Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的随机不同数_Java_Random_Numbers - Fatal编程技术网

Java中的随机不同数

Java中的随机不同数,java,random,numbers,Java,Random,Numbers,在Java中,为非有向图生成随机边有一个问题。问题与完全相同,但我没有matlab中的randperm函数。我尝试创建一个大小为v*(v-1)*0.5的列表,其中v是图形中的许多顶点,并将其洗牌。然而,我试图在有一百万个顶点的图中生成一亿条边。包含大约10e12项的列表是一个真正的问题。因此,我需要1亿个介于1和10e12之间的不同数字,但我不知道如何获取它们。如果您想要一个不重复的可能值的小子集,则使用集合是更好的方法。这只需要保留您以前看到的元素,以避免重复 Set<Long>

在Java中,为非有向图生成随机边有一个问题。问题与完全相同,但我没有matlab中的
randperm
函数。我尝试创建一个大小为
v*(v-1)*0.5
的列表,其中
v
是图形中的许多顶点,并将其洗牌。然而,我试图在有一百万个顶点的图中生成一亿条边。包含大约
10e12
项的列表是一个真正的问题。因此,我需要1亿个介于
1
10e12
之间的不同数字,但我不知道如何获取它们。

如果您想要一个不重复的可能值的小子集,则使用集合是更好的方法。这只需要保留您以前看到的元素,以避免重复

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--;
    }
}
Set longs=新哈希集(100_000_000*10/7);//对于0.5的荷载系数
Random rand=新的Random();
对于(int i=0;i<100_000;i++){
Long l=Math.abs(rand.nextLong()%1000\u 000\u 000\u 000L);
如果(长加(l)){
//新长
}否则{
我--;
}
}

HashSet在每个条目中使用大量内存,因此更有效的解决方案是使用基本集,例如1亿个long应该使用1到2 GB的内存。

您的问题是生成不同的数字还是生成非常大的数字?可能重复的I需要大量不同的随机数对((a,b)和(b,a)(同一对)