私はまだ初心者ですので親切にしてください。私はFisher-Yatesアルゴリズムが配列要素を永久に変更する理由と、コレクションのシャッフル方法では理解できないことがあります。私は、Fisher-Yatesアルゴリズムがどのように機能するかを実際には正しく理解していないかもしれないと考えていますが、助けていただければ幸いです。以下のコード:Fisher-Yates(java)vs. Collections.shuffle
import java.util。*;
パブリッククラスArrayShuffle {
private static char[] letters = {'a','b','c','d','e','f','g'};
public static void main(String[] args) {
System.out.println("Collections' shuffle method:");
shuffleCollections(letters);
System.out.print(letters);
System.out.println();
System.out.println("Fisher-Yates method:");
shuffleFisherYates(letters);
System.out.print(letters);
}
public static void shuffleCollections(char[] abc) {
List letterList = new ArrayList();
for(int alph=0; alph<abc.length; alph++)
//convert char to ArrayList object
letterList.add(abc[alph]);
//shuffle
Collections.shuffle(letterList);
System.out.println(letterList);
}
public static void shuffleFisherYates(char[] abc) {
int size = abc.length;
Random random = new Random();
for(int alph=0; alph<abc.length; alph++) {
int randomIndex = alph + random.nextInt(size - alph);
char randomLetter = abc[randomIndex];
abc[randomIndex] = abc[alph];
abc[alph] = randomLetter;
}
for(int shuffled = 0; shuffled<abc.length; shuffled++)
System.out.print(abc[shuffled]+" ");
System.out.println();
}
}
試したときの入力と出力は何ですか? – SMA
さて、配列の要素をリストにコピーして、そのリストを入れ替えるだけです。なぜ配列が変更されるのですか?配列がオブジェクトの配列で、Collections.shuffle(Arrays.asList(array))を使用した場合、配列はシャッフルされます(Arrays.asListはコピーではなく元の配列のリストビューです)。 –