Come funziona la riproduzione casuale da casuale in Python?
Chiedo perché funziona molto velocemente. Quando provo a scrivere shuffle funziona 1 minuto per 10 ^ 6 elementi, ma Python shuffle lo fa in 8 sec?
Come funziona la riproduzione casuale da casuale in Python?
Chiedo perché funziona molto velocemente. Quando provo a scrivere shuffle funziona 1 minuto per 10 ^ 6 elementi, ma Python shuffle lo fa in 8 sec?
Risposte:
Python random.shuffle
usa lo shuffle Fisher-Yates , che gira in tempo O (n) ed è dimostrato essere uno shuffle perfetto (supponendo un buon generatore di numeri casuali).
Consente di scorrere l'array dall'ultima alla prima voce, cambiando ciascuna voce con una voce in corrispondenza di un indice casuale sottostante.
Il processo di base del mescolamento di Fisher-Yates è simile al prelievo casuale di biglietti numerati da un cappello o di carte da un mazzo, uno dopo l'altro fino a quando non ce ne sono più. Ciò che l'algoritmo specifico fornisce è un modo per farlo numericamente in modo efficiente e rigoroso che, correttamente eseguito, garantisce un risultato imparziale ...
La moderna soluzione ... è quella di spostare i numeri "colpiti" alla fine dell'elenco scambiandoli con l'ultimo numero non bloccato ad ogni iterazione. Ciò riduce la complessità temporale dell'algoritmo a O (n), rispetto a O (n 2 ) per l'implementazione ingenua. Questa modifica fornisce il seguente algoritmo (per un array a base zero).
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]