我正在尝试创建一个文本文件,其中包含10亿个随机排序的非重复数字。我创建了以下代码,但是在完成(堆满)之前很久内存不足。我正在寻找有关如何创建此txt文件的建议或代码更正。

private int maxSize = 1000000000;
private int minimum = 1;
try {
        ArrayList<Integer> arrayList = new ArrayList<Integer>();
        for(int i = minimum - 1; i < maxSize; i++){
            arrayList.add( i);
}
numlist.close();


// shuffle 10 times for true mix up

for(int j = 0; j < 10; j++){
            Collections.shuffle(arrayList);
}

BufferedWriter numlist = new BufferedWriter(new FileWriter("randomNumbersNoRepeats.txt"));
for(int i = minimum - 1; i < maxSize; i++){
    System.out.println(i);
    numlist.write(i + ",");
}

numlist.close();
} catch (Exception e) {
     System.out.println("Error in creating writer new bufferWriter"
        + " for randomNumbersNoRepeats.txt");
     }

最佳答案

宣布:

private static final int maxSize = 1_000_000_000;
static int[] array = new int[maxSize];


用非重复数字填充数组,例如array[i] = i + 1;

编写使用Fisher–Yates shuffle algorithm的改组方法。这不需要很多代码行,所以我认为我不需要为您做。

使用类似-Xmx10G VM参数的程序运行程序。这将确保为阵列分配足够的堆空间。

感谢安迪·特纳(Andy Turner)的启发。编辑:安迪(Andy)继续激发灵感:要一次性初始化和改组数组,可以使用同一Wikipedia文章中所述的inside-out algorithm。在Java中:

    Random r = new Random();
    for (int i = 0; i < maxSize; i++) {
        int j = r.nextInt(i + 1);
        if (j != i) {
            array[i] = array[j];
        }
        array[j] = i + 1;
    }

10-07 17:01
查看更多