-2

次の質問のコードを書きましたが、機能しません。乱数を取得しますが、シャッフル メソッドでは乱数がシャッフルされません。助けてくれませんか?

for( each index i)

   choose a random index j where j>=i.
   swap the elements at index i and j.

私のコードは次のとおりです。

public static void shuffle(int[] a){
   for( int i = 0; i < a.length-1; i++){
       int range = a.length; 
       int j = (int) (Math.random() * range);
       swap(a, i, j);      
  }
}

public static void swap(int[] array, int i, int j){

        if (i != j) {
            int temp = array[i];
            array[i] = array[j];
            array[j] = temp;
        }
    }
4

2 に答える 2

0

リストで動作する java.util.Collections.shuffle があります。アルゴリズムを src からコピーして貼り付け、int[] で動作するように変更することをお勧めします。

public static void shuffle(int[] a) {
    Random rnd = new Random();
    for (int i = a.length; i > 1; i--) {
        swap(a, i - 1, rnd.nextInt(i));
    }
}

private static void swap(int[] a, int i, int j) {
    int tmp = a[i];
    a[i] = a[j];
    a[j] = tmp;
}


public static void main(String[] args) {
    int[] a = {1, 2, 3, 4, 5, 6, 7, 8, 9};
    shuffle(a);
    System.out.println(Arrays.toString(a));
}

版画

[8, 7, 3, 4, 6, 1, 2, 5, 9]
于 2013-02-12T05:24:02.103 に答える
0

配列を Integer Wrapper クラスに変換し、Integer 配列を List に変換して Collections.shuffle を呼び出します。スニペットは以下のとおりです

Apache lang ライブラリにアクセスできる必要があります。その後、次のように ArrayUtils.toObject(int[]) メソッドを使用できます。

int [] array = {1,2,3,4,5,6};
Integer[] newArray = ArrayUtils.toObject(array);
Collections.shuffle(Arrays.asList(newArray));
for (int i = 0; i < newArray.length; i++) {
    System.out.println(newArray[i]);
}

Apcahe Lang Library がない場合は、この方法で実行できます

Integer[] newArray = new Integer[array.length];
int i = 0;
for (int value : array) {
    newArray[i++] = Integer.valueOf(value);
}
于 2013-02-12T05:40:33.153 に答える