Link Search Menu Expand Document
El Libro De Python (24.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.