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
0y 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_cartassobre la baraja ordenada. Mide como de probable es que una carta acabe en diferentes posiciones. Concluye si la funciรณn es verdaderamente aleatoria.