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?
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)
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 1do
j ← random integer with0≤ j ≤ i
exchange a[j]and a[i]
Respuestas:
Python
random.shuffle
utiliza 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.
fuente