¿Cómo funciona la mezcla aleatoria de Python?


11

¿Cómo barajar trabajos aleatorios en Python?

Pregunto porque funciona muy rápido. Cuando intento escribir shuffle, funciona 1 minuto para 10 ^ 6 elemento, pero ¿Python shuffle lo hace en 8 segundos?


14
¿Por qué no solo mirar el código fuente ?
la pereza

44
mejor algoritmo shuffle es los pescadores-Yates shuffle, que se ejecuta en tiempo O (n) y se ha demostrado ser una perfecta reproducción aleatoria (suponiendo buena fuente al azar)
loco de trinquete

1
@ratchetfreak: Python usa Fisher-Yates.
Martijn Pieters

1
¿Cuál es su algoritmo para barajar?
whatsisname

@sloth, por cierto, Raymond Hettinger propuso una práctica universal de documentos vinculados al código fuente en 2011.
Cristian Ciupitu

Respuestas:


17

Python random.shuffleutiliza el shuffle Fisher-Yates , que se ejecuta en tiempo O (n) y se ha demostrado que es un shuffle perfecto (suponiendo un buen generador de números aleatorios).

Repite la matriz de la última a la primera entrada, cambiando cada entrada con una entrada en un índice aleatorio debajo de ella.

El proceso básico de barajar Fisher-Yates es similar a recoger aleatoriamente boletos numerados de un sombrero o cartas de un mazo, uno tras otro hasta que no queden más. Lo que proporciona el algoritmo específico es una forma de hacerlo numéricamente de una manera eficiente y rigurosa que, si se hace correctamente, garantiza un resultado imparcial ...

La solución moderna ... es mover los números "tachados" al final de la lista intercambiándolos con el último número desbloqueado en cada iteración. Esto reduce la complejidad temporal del algoritmo a O (n), en comparación con O (n 2 ) para la implementación ingenua. Este cambio proporciona el siguiente algoritmo (para una matriz basada en cero).

To shuffle an array a of n elements (indices 0..n-1):
  for i from n  1 downto 1 do
       j  random integer with 0  j  i
       exchange a[j] and a[i]
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.