我有一个方法,它使用随机样本近似计算.这种方法被称为数百万次,所以非常重要的是选择随机数的过程是有效的.
我不知道javas Random().nextInt真的是多快,但是我的程序似乎没有像我想要的那样受益.
当选择随机数时,我做以下(半伪代码):
// Repeat this 300000 times
Set set = new Set();
while(set.length != 5)
set.add(randomNumber(MIN,MAX));
现在,这显然是一个糟糕的最坏情况运行时间,因为理论上的随机函数可以为永恒添加重复的数字,从而永远保持在while循环中.但是,这些数字从{0..45}中选择,所以重复的值在很大程度上是不可能的.
当我使用上述方法时,它比我的其他方法快40%,这并不近似,而是得到正确的结果.这运行了一百万次,所以我期待这种新方法比至少快50%.
对于更快的方法你有什么建议吗?或者也许你知道一个更有效的生成一组随机数的方法.
要澄清,这里有两种方法:
// Run through all combinations (1 million). This takes 5 seconds
for(int c1 = 0; c1 < deck.length; c1++){
for(int c2 = c1+1; c2 < deck.length; c2++){
for(int c3 = c2+1; c3 < deck.length; c3++){
for(int c4 = c3+1; c4 < deck.length; c4++){
for(int c5 = c4+1; c5 < deck.length; c5++){
enumeration(hands, cards, deck, c1, c2, c3, c4, c5);
}
}
}
}
}
// Approximate (300000 combinations). This takes 3 seconds
Random rand = new Random();
HashSet set = new HashSet();
int[] numbers = new int[5];
while(enumerations < 300000){
set.clear();
while(set.size() != 5){
set.add(rand.nextInt(deck.length));
}
Iterator i = set.iterator();
int n = 0;
while(i.hasNext()){
numbers[n] = i.next();
n++;
}
经过一番测试和剖析,我发现这种方法是最有效的:
Random rand = new Random();
int[] numbers = new int[5];
ArrayList list = new ArrayList();
while(enumerations < 300000){
while(list.size() != 5) {
int i = rand.nextInt(deck.length);
if(!list.contains(i)) list.add(i);
}
int index = 0;
for(int i : list){ numbers[index] = i; index++; }
enumeration(hands, cards, deck,numbers);
}