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.