Implementar el algoritmo de barajado Fisher-Yates en Python
Ahora que tenemos una sólida comprensión del algoritmo de barajado Fisher-Yates, profundicemos en cómo implementarlo en Python. Python proporciona un módulo incorporado random
que podemos utilizar para generar los números aleatorios necesarios para el proceso de barajado.
Implementación básica
A continuación, se presenta una implementación básica del algoritmo de barajado 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
En esta implementación, la función shuffle_list
toma una lista lst
como entrada y devuelve la lista barajada. La función itera a través de la lista desde el último elemento hasta el segundo elemento, y para cada elemento, lo intercambia con un elemento seleccionado aleatoriamente de la parte no barajada restante de la lista.
A continuación, se muestra un ejemplo de uso:
original_list = [1, 2, 3, 4, 5]
shuffled_list = shuffle_list(original_list)
print(shuffled_list)
Esto mostrará una versión aleatoriamente barajada de la lista original, como [3, 1, 4, 2, 5]
.
Optimizar el algoritmo de barajado Fisher-Yates en Python
Si bien la implementación básica ya es eficiente, podemos optimizar aún más el algoritmo de barajado Fisher-Yates en Python utilizando la función random.sample
, que está optimizada para generar una muestra aleatoria de una secuencia.
A continuación, se presenta una versión optimizada de la función shuffle_list
:
import random
def shuffle_list(lst):
"""Shuffle a list using the optimized Fisher-Yates algorithm."""
return random.sample(lst, len(lst))
Esta implementación utiliza la función random.sample
para generar una nueva lista con los mismos elementos que la lista de entrada, pero en un orden aleatorio. Este enfoque es más eficiente que la implementación básica, ya que evita la necesidad de intercambiar explícitamente los elementos.
Tanto la implementación básica como la optimizada del algoritmo de barajado Fisher-Yates en Python son eficientes y proporcionan un barajado sin sesgo de la lista de entrada. La elección entre las dos implementaciones puede depender de los requisitos específicos de su aplicación, como el tamaño de la lista o la necesidad de personalización adicional.