15.7. Barajar el mazo

Si un mazo esta perfectamente barajado, cualquier naipe tiene la misma probabilidad de aparecer en cualquier posición del mazo, y cualquier lugar en el mazo tiene la misma probabilidad de contener cualquier naipe.

Para mezclar el mazo, utilizaremos la función randrange del modulo random. Esta función toma dos enteros como argumentos a y b, y elige un numero entero en forma aleatoria en el rango a <= x <b. Como el l³mite superior es estrictamente menor a b, podemos usar la longitud de la lista como el segundo argumento y de esa manera tendremos garantizado un índice legal dentro de la lista. Por ejemplo, esta expresión selecciona el índice de un naipe al azar dentro del mazo:

   1: random.randrange(0, len(self.cartas))

Una manera sencilla de mezclar el mazo es recorrer los naipes e intercambiar cada una con otra elegida al azar. Es posible que el naipe se intercambie consigo mismo, pero no es un problema. De hecho, si eliminamos esa posibilidad, el orden de los naipes no será completamente al azar:




   1: class Mazo:
   2:     ...
   3:     def mezclar(self):
   4:         import random
   5:         nCartas = len(self.cartas)
   6:         for i in range(nCartas):
   7:             j = random.randrange(i, nCartas)
   8:                 self.cartas[i], self.cartas[j] =\
   9:                 self.cartas[j], self.cartas[i]


En lugar de presuponer que hay cincuenta y dos naipes en el mazo, obtenemos la longitud real de la lista y la almacenamos en nCartas.


Para cada naipe del mazo, seleccionamos un naipe al azar entre aquellos que no han sido intercambiados aun. Luego intercambiamos el naipe actual (i) con el naipe seleccionado (j). Para intercambiar los naipes usaremos la asignación de tuplas, como se describe en la Sección 9.2:




   1: self.cartas[i], self.cartas[j] = self.cartas[j], self.cartas[i]

 

Como ejercicio, reescriba esta línea de código sin usar una asignación de secuencias.

0