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