2011-05-29 71 views
4

我是一名Java初學者,正在從書中做練習。任務是編寫一個靜態方法,該方法將一個字符串數組作爲參數,並以隨機順序返回字符串的混亂版本。要創建您必須使用以下的隨機數:混亂字符串 - Java方法

import java.util.Random; 
Random r = new Random(); 
int rand = r.nextInt(); 

我的回答如下:

private static String[] jumble(String[] arr){ 
    String [] jumbled = new String[arr.length]; 
    int [] chosen = new int [arr.length]; 
    Random r = new Random(); 
    int rand = r.nextInt(arr.length); 
    chosen[0] = rand; 
    jumbled[0] = arr[rand]; 
    for(int i = 1; i < arr.length; i++){ 
     while(checkIfChosen(chosen, rand, i)){ 
      rand = r.nextInt(arr.length); 
     } 
     chosen[i] = rand; 
     jumbled[i] = arr[rand]; 
    } 
    print(jumbled); 
    return jumbled; 
} 


private static void print(String[]arr){ 
    for(int i = 0; i < arr.length; i++){ 
     System.out.println(arr[i]); 
    } 
} 

private static boolean checkIfChosen(int[] arr, int a, int ind){ 
    for(int i = 0; i < ind; i++){ 
     if(arr[i]==a){ 
      return true; 
     } 
    } 
    return false; 
} 

這並不工作,但它似乎很BL ** DY長篇大論的東西那麼簡單。任何人都可以改進呢?任何更簡單的方法來執行這樣的任務,堅持問題中提到的約束條件?

編輯:費希爾耶茨洗牌:

public static void main(String[] args) { 
    String [] original = {"Hello", "How", "Are", "You"}; 
    jumble(original); 
} 


private static String[] jumble(String[] arr){ 
    Random r = new Random(); 
    for(int i = arr.length-1; i > 0; i--){ 
     int rand = r.nextInt(i); 
     String temp = arr[i]; 
     arr[i] = arr[rand]; 
     arr[rand] = temp; 
    } 
    print(arr); 
    return arr; 
} 


private static void print(String[]arr){ 
    for(int i = 0; i < arr.length; i++){ 
     System.out.println(arr[i]); 
    } 
} 

一個偉大的一段代碼,並遠遠超過我的答案更有效。謝謝。

回答

4

您可能只是想使用Fisher-Yates shuffle。只需要一次就可以做到,並且應該產生一個「公平的」洗牌(假設你的隨機數發生器有足夠的熵位)。

+0

@ user559142:這比我的答案要好。 1+(我也喜歡熵部分)。 – 2011-05-29 21:37:28

1

你的代碼對我來說很不錯。主要的不同我會做的是開始我的for循環索引爲0,內部使用do/while循環,在for循環之前不做隨機化和分配,而是在for循環中完成所有這些:

Random r = new Random(); 
    int rand = 0; 
    for (int i = 0; i < arr.length; i++) { 
    do { 
     rand = r.nextInt(arr.length); 
    } while (checkIfChosen(chosen, rand, i)); 
    chosen[i] = rand; 
    jumbled[i] = arr[rand]; 
    } 

do/while循環保證至少運行一次,而不是根據條件運行或不運行的while循環。