我想創建一個方法來獲取名稱數組,並返回隨機重新排列名稱的列表副本。下面的代碼返回一個重複名稱的新列表。我能做些什麼來改變新列表的名字呢?給定一個String數組,如何創建第二個數組,這是對原始數據的重新排列?
public static String[] shuffle(String []names)
{
int num =0;
String [] newArray = new String [names.length];
Random r = new Random();
for(int i = 0; i<names.length; i++){
num = r.nextInt(names.length);
if((i-1)!=num){
newArray[i]=names[num];
}
}
return newArray;
}
第(1)算法不會返回置換 - 它可能包含重複。 (2)'aux'在這一點上是沒有意義的,'newArray [i] == null',所以你基本上是在操縱原來的東西,並把'null'放在它裏面(稍後可能會流向'newArray'後來的排列)。另外,如果你想在同一個數組中進行交換,那麼這個解決方案是有偏見的,因爲必須在範圍'[0,i]中選擇隨機數來獲得均勻分佈的置換。 – amit
謝謝@amid,你部分是對的。我沒有創建重複項,因爲我認爲我正在處理原始數組。我更新了我的答案。 nextInt也會生成均勻分佈的值,所以他將得到正確的置換。 – dan
每個int將是均勻分佈的,但排列本身不會(有些解決方案比其他解決方案更有可能,這不是所需的特性)[This thread](http://stackoverflow.com/q/5131341/ 572670)討論了這個問題。 (我承認這是一個有點複雜的問題,但它是一個重要的問題)。此外 - 解決方案仍然不起作用 - (最後一行仍然是'names'而不是'newArray',並且您需要在開始之前填入'newArray',否則 - 它只是一堆'null's移動) – amit