Java Collections.shuffle fait quoi?
-
20-09-2019 - |
Question
Je me suis récemment trouvé devant être sûr que ma liste n'a pas été dans l'ordre. Mise en veille prolongée a été assez gentil pour le retourner en parfait état. Mise en veille prolongée idiot, ne pas lire mon esprit.
Je regardais mon API Java et il me dit sa méthode de lecture aléatoire fait ceci:
permute aléatoirement la liste spécifiée en utilisant une source de défaut de caractère aléatoire.
Être le george curieux que je suis, je veux savoir ce que cela signifie exactement. Y at-il un cours de mathématiques que je peux apprendre cela? Puis-je voir le code? Java, qu'est-ce que tu fais à mon ArrayList?!?!?
Pour être plus précis, les concepts mathématiques sont utilisés ici?
La solution
Oui, vous pouvez regarder le code; il fait essentiellement un Fisher-Yates lecture aléatoire. Ici, il est (grâce OpenJDK, et youpi pour :-P open source):
public static void shuffle(List<?> list, Random rnd) {
int size = list.size();
if (size < SHUFFLE_THRESHOLD || list instanceof RandomAccess) {
for (int i=size; i>1; i--)
swap(list, i-1, rnd.nextInt(i));
} else {
Object arr[] = list.toArray();
// Shuffle array
for (int i=size; i>1; i--)
swap(arr, i-1, rnd.nextInt(i));
// Dump array back into list
ListIterator it = list.listIterator();
for (int i=0; i<arr.length; i++) {
it.next();
it.set(arr[i]);
}
}
}
Le procédé d'échange:
private static void swap(Object[] x, int a, int b) {
Object t = x[a];
x[a] = x[b];
x[b] = t;
}
Autres conseils
la JavaDoc Collections donne des informations sur la méthode de lecture aléatoire utilisé.
Cette mise en œuvre parcourt la liste en arrière, du dernier élément à la seconde, en échangeant de façon répétée un élément choisi au hasard dans la « position actuelle ». Les éléments sont choisis au hasard dans la partie de la liste qui relie le premier élément à la position actuelle, inclus.
Il commence à la fin et se dirige la liste en arrière. A chaque élément de la butée et permute l'élément en cours avec un élément précédent dans la liste. La "source par défaut de hasard" dans ce cas est probablement