2013-07-14 88 views
2

我需要在Java中儘可能高效地生成0到1000之間的非重複隨機數列表。我現在只有2個想法,想知道是否還有其他更好的想法,如果不是,我應該使用以下想法?高效地生成Java中的隨機非重複數字列表

    • 生成0和1000之間的隨機數r,並將其添加到稱爲randomArray [R]在標r
    • 生成另一個隨機數,並檢查另一個陣列如果randomArray [R]是不是已經存儲先前生成的隨機數
    • 繼續下去,直到我做
    • 產生一個數組,並用它填充它的元素s指數
    • 將其像瘋了似的洗牌(另外,我怎樣纔能有效地做到這一點?)
    • 從頭開始使用數組中的元素值。

謝謝!

+2

嘖嘖,我不記得今天已經看到這個問題了,現在已經接近午夜了!新紀錄! –

回答

2

java.util.Collections.shuffle方法將相同可能性的列表洗牌。創建一個List並將值從0增加到1000.然後使用此方法緩衝List。

List l = new ArrayList(); 
for(int i = 0; i <= 1000; i++) 
    l.add(i); 

Collections.shuffle(l); 

現在列表中包含混洗值。

+1

建議編輯:'new ArrayList(1001);' – johnchen902

+0

爲什麼1001而不是1000? –

+0

@QuinnLiu從0到1000有1001個數字:p – stinepike

1

嘗試使用LinkedHashSet<Integer>(請參閱documentation)。

定期中存儲一組Integer小號有效地:將一個新的號碼,並檢查一個數是否已經存在在一定時間(在陣列中存儲的號碼時,如你所提到的,這些查找採取線性的時間內完成去檢查)。現在

,因爲你說你要號碼的列表,我們使用具有普通的所有屬性LinkedHashSet<Integer>,也garantees,如果您遍歷所有的元素,你總是會通過他們在同一個迭代訂購。

的代碼會是這個樣子:

Set<Integer> randomNumberList = new LinkedHashSet<Integer>(); 

int r; 

// Make sure the number is not present in the list, and then add it: 
do { 
    r = ... // Generate your next random number 
} while(randomNumberList.contains(r)); 

// At this point, we know r is not in the list, so add it: 
randomNumberList.add(r); 

// Do the previous as many times as you want. 

// Now, to iterate over the list: 
for(Integer number : randomNumberList) { 
    // Do something... 
} 

注意,do - 如果你想確保你實際上是一個號碼添加到列表中while循環是必要的。