Come funziona Python random shuffle?


11

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?


14
Perché non guardare solo il codice sorgente ?
bradipo

4
miglior algoritmo shuffle è la Fisher-Yates Shuffle, viene eseguito in O (n) e ha dimostrato di essere uno shuffle perfetto (supponendo buona fonte casuale)
cricchetto maniaco del

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

1
Qual è il tuo algoritmo per shuffle?
whatsisname

@sloth, a proposito, Raymond Hettinger ha proposto una pratica universale di documenti collegati al codice sorgente nel 2011.
Cristian Ciupitu,

Risposte:


17

Python random.shuffleusa 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]
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.