Barajar cartas con shuffle
En este ejemplo vemos como barajar una list
que contiene las cartas 52
de Poker. Entendemos por barajar el mezclarlas de forma aleatoria
Empezamos definiendo la baraja
de Poker. El uso de product
nos permite generar todas las cartas pero están ordenadas de A
a K
y de Picas
a Diamantes
.
import itertools
import random
palos = ['Picas', 'Corazones', 'Tréboles', 'Diamantes']
numeros = ['A'] + list(range(2, 11)) + ['J', 'Q', 'K']
baraja = list(itertools.product(numeros, palos))
Vamos entonces a definir una función baraja_cartas
que las baraje. Hay muchas formas de hacer esto, siendo una de ellas el algoritmo de Fisher-Yates. Sin embargo este tiene muchas variantes dependiendo de la eficiencia, si baraja la propia entrada o crea una nueva, etc.
En nuestro caso vamos a implementarlo de la manera mas sencilla:
- 🔚 Iteramos nuestra baraja de fin a principio.
- 🎲 Para cada carta tiramos un dado para generar un número aleatorio entre
0
y la carta en la que estamos. - 🔁 Cambiamos la carta de posición.
def baraja_cartas(b):
n = len(b)
for i in range(n - 1, 0, -1):
j = random.randint(0, i)
b[i], b[j] = b[j], b[i]
Y la podemos usar de la siguiente manera. Es importante notar que nuestra función modifica la propia baraja
. Es decir, no crea una nueva variable barajada.
baraja_cartas(baraja)
for carta in baraja:
print(f"{carta[0]} de {carta[1]}")
Aunque es importante saber como funcionan las cosas, si quieres barajar lo más práctico es que uses la función shuffle
que viene con el paquete
random.
random.shuffle(baraja)
✏️ Ejercicios:
- Escribe un programa que realice cientos de simulaciones usando la función
baraja_cartas
sobre la baraja ordenada. Mide como de probable es que una carta acabe en diferentes posiciones. Concluye si la función es verdaderamente aleatoria.