Link Search Menu Expand Document
El Libro De Python (24.95 €) 39.95 €

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.