在java中生成50万个唯一整数

时间:2015-08-20 11:56:57

标签: java algorithm time-complexity space-complexity

我希望在1到100万的范围内生成500000个唯一的随机整数。数字必须是唯一的,我希望它在至少线性时间内,而不需要使用这么多内存。有人能想出解决方案吗?

2 个答案:

答案 0 :(得分:1)

之前的was said,您可以随机播放这些数字,然后拉出前半部分以便它们是唯一的。这是线性的,因为改组是O(n),第一部分是O(n/2)

Hare是该线程的修改实现。这将打印1-1k范围内的500k个独特随机数。

import java.util.ArrayList;
import java.util.Collections;

public class UniqueRandomNumbers {

public static void main(String[] args) {
    ArrayList<Integer> list = new ArrayList<Integer>();
    for (int i=1; i<1000001; i++) {
        list.add(new Integer(i)); // adding all the numbers between 1-1m to a list.
    }
    Collections.shuffle(list); // using the built in shuffle function to make the unique order
    for (int i=0; i<500000; i++) {
        System.out.println(list.get(i)); // printing the first 500k. Replace this with whatever you want to do with those numbers. 
        //Notice - since it might take a while, it might be worth it to let the user know of the progress.
    }
}
}

答案 1 :(得分:1)

如果内存非常珍贵,请使用位图记住已选择的百万分之一,然后重复选择一个随机数并在500,000之后停止。这基本上是存储最优的,因为lg(1e6选择0.5e6)并不比1e6小得多。