我有一個方法,它使用隨機樣本近似計算。這種方法被稱爲數百萬次,所以選擇隨機數的過程非常重要。有效選擇隨機數
我不知道Java類的速度有多快Random().nextInt
真的,但我的計劃似乎並沒有那麼多好處,我想這一點。
當選擇隨機數,我做了以下(處於半僞代碼):
// Repeat this 300000 times
Set set = new Set();
while(set.length != 5)
set.add(randomNumber(MIN,MAX));
現在,這顯然有不好的最壞情況下的運行時間,因爲在理論上隨機功能爲永恆添加重複的數字,從而永遠留在while循環中。但是,這些數字是從{0..45}中選擇的,因此重複值大多數情況下不太可能。
當我用上面的方法,比我的另一種方法,它不接近它的速度只有40%,但產生正確的結果。這是大約100萬次,所以我期待這種新方法至少快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<Integer> set = new HashSet<Integer>();
int[] numbers = new int[5];
while(enumerations < 300000){
set.clear();
while(set.size() != 5){
set.add(rand.nextInt(deck.length));
}
Iterator<Integer> i = set.iterator();
int n = 0;
while(i.hasNext()){
numbers[n] = i.next();
n++;
}
一些測試和分析之後,我發現這個方法是最有效的:
Random rand = new Random();
int[] numbers = new int[5];
ArrayList<Integer> list = new ArrayList<Integer>();
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);
}
你能再說一遍是什麼,你要完成?你是否試圖用每個方法調用生成一組N個不同的數字?你談論的是將這種方法與另一個「不近似」而另一種方法更快 - 是真正的問題隨機數生成還是用於其他計算(近似與非近似)的方法? – 2010-03-26 13:32:47
問題是隨機數字的產生。其他計算不相關,這就是爲什麼我沒有提到他們在我的問題。 – 2010-03-26 13:40:32