Quale dei seguenti due algoritmi shuffle ( shuffle1
e shuffle2
) è più casuale?
public final class Shuffle {
private static Random random;
public static void shuffle1(final Object[] array) {
if (random == null) {
random = new Random();
}
for (int i = array.length - 1; i > 0; i--) {
swap(array, i, random.nextInt(i + 1));
}
}
public static void shuffle2(final Object[] array) {
if (random == null) {
random = new Random();
}
for (int i = 0; i < array.length; i++) {
swap(array, i, i + random.nextInt(array.length - i));
}
}
protected static void swap(final Object[] array, final int i, final int j) {
final Object tmp = array[i];
array[i] = array[j];
array[j] = tmp;
}
}
L'algoritmo shuffle2
garantisce che tutti gli elementi siano direttamente toccati, ma, in shuffle1
algoritmo, l'elemento con indice = 0 non viene mai direttamente toccato a causa della condizione i > 0
.