Implémentation du mélange de Fisher-Yates en Python
Maintenant que nous comprenons bien l'algorithme de mélange de Fisher-Yates, plongeons dans la manière de l'implémenter en Python. Python fournit un module intégré random
que nous pouvons utiliser pour générer les nombres aléatoires nécessaires au processus de mélange.
Implémentation de base
Voici une implémentation de base du mélange de Fisher-Yates en Python :
import random
def shuffle_list(lst):
"""Shuffle a list using the Fisher-Yates algorithm."""
for i in range(len(lst) - 1, 0, -1):
j = random.randint(0, i)
lst[i], lst[j] = lst[j], lst[i]
return lst
Dans cette implémentation, la fonction shuffle_list
prend une liste lst
en entrée et renvoie la liste mélangée. La fonction parcourt la liste depuis le dernier élément jusqu'au deuxième élément, et pour chaque élément, elle l'échange avec un élément sélectionné aléatoirement dans la partie non mélangée restante de la liste.
Voici un exemple d'utilisation :
original_list = [1, 2, 3, 4, 5]
shuffled_list = shuffle_list(original_list)
print(shuffled_list)
Cela affichera une version aléatoirement mélangée de la liste d'origine, comme [3, 1, 4, 2, 5]
.
Optimisation du mélange de Fisher-Yates en Python
Bien que l'implémentation de base soit déjà efficace, nous pouvons encore optimiser le mélange de Fisher-Yates en Python en utilisant la fonction random.sample
, qui est optimisée pour générer un échantillon aléatoire à partir d'une séquence.
Voici une version optimisée de la fonction shuffle_list
:
import random
def shuffle_list(lst):
"""Shuffle a list using the optimized Fisher-Yates algorithm."""
return random.sample(lst, len(lst))
Cette implémentation utilise la fonction random.sample
pour générer une nouvelle liste avec les mêmes éléments que la liste d'entrée, mais dans un ordre aléatoire. Cette approche est plus efficace que l'implémentation de base, car elle évite le besoin d'échanger explicitement les éléments.
Les deux implémentations, de base et optimisée, du mélange de Fisher-Yates en Python sont efficaces et fournissent un mélange non biaisé de la liste d'entrée. Le choix entre les deux implémentations peut dépendre des exigences spécifiques de votre application, comme la taille de la liste ou le besoin de personnalisation supplémentaire.