我需要从1到1,000,000的范围内获取100个随机数字,这些数字必须是唯一的,不能重复。
这与此问题类似,但我的范围太大了,无法创建数组。
我需要多次生成这100个随机数,因此生成速度需要尽可能快,最好是O(1)。有什么最快的方法吗?
我需要多次生成这100个随机数,因此生成速度需要尽可能快,最好是O(1)。有什么最快的方法吗?
MersenneTwisterFast ran = new MersenneTwisterFast();
long time = System.nanoTime();
Set set = new HashSet(100);
while( set.size()<100) {
set.add(ran.nextInt(1000000));
}
System.out.println(System.nanoTime()-time+" : nano");
System.out.println(set.size());
nextInt()
)确实快了一倍,但是一旦你使用一个边界(nextInt(100)
),差异就会消失为零。 - Marko Topolnikran.nextInt()
可能会被调用150次甚至更多。有没有限制? - Yogendra Singh在这里创建一个随机数。
Random generator = new Random();
int d = 1000; //milliseconds
ActionListener t = new ActionListener() {
public void actionPerformed(ActionEvent e) {
//...Number genration task Here
for (int idx = 1; idx <= 10; ++idx){
int r = generator.nextInt(1000000);
log("Generated : " + r);
}
}
};
new Timer(a,t).start()
免责声明:此解决方案仅在可能生成的数字数量远远超过您需要生成的数字数量时才能快速工作!
编辑:如果您喜欢,也可以使用Mersenne Twister来运行此代码。
import java.util.HashSet;
import java.util.Iterator;
import java.util.Random;
public class MakeRand {
private static final HashSet<Integer> theNumbers = new HashSet<Integer>();
private static final Random myRandom = new Random();
private static void addNumber() {
int newNumber = -1;
do {
newNumber = myRandom.nextInt(1000000) + 1;
} while(theNumbers.contains(newNumber));
theNumbers.add(newNumber);
}
public static void populate(int howMany) {
for (int i = 0; i < howMany; i++) {
addNumber();
}
}
public static void main(String args[]) {
populate(100);
Iterator<Integer> iter = theNumbers.iterator();
while(iter.hasNext()) {
Integer current = iter.next();
System.out.println(current);
}
}
}
100
个随机数,而不是任意数量的随机数。 - Miserable Variable