Como o shuffle aleatório do Python funciona?

11

Como embaralhar obras aleatórias em Python?

Eu pergunto porque funciona muito rápido. Quando tento escrever aleatoriamente, funciona 1 minuto para 10 ^ 6 elemento, mas Python embaralha isso em 8 segundos?

Paweł Szymański
fonte
14
Por que não apenas olhar o código fonte ?
Preguiça
4
melhor algoritmo shuffle é o Fisher-Yates shuffle, ele é executado em O (n) o tempo e é provado ser um embaralhamento perfeito (assumindo boa fonte aleatória)
aberração catraca
11
@ratchetfreak: Python usa Fisher-Yates.
Martijn Pieters 28/10
11
Qual é o seu algoritmo para a reprodução aleatória?
Whatsisname
@sloth, a propósito, Raymond Hettinger propôs uma prática universal de docs ligando de volta para o código-fonte de volta em 2011.
Cristian Ciupitu

Respostas:

17

O Python random.shuffleusa o shuffle de Fisher-Yates , que é executado no tempo O (n) e provou ser um shuffle perfeito (assumindo um bom gerador de números aleatórios).

Ele itera a matriz da última para a primeira entrada, alternando cada entrada com uma entrada em um índice aleatório abaixo dela.

O processo básico de embaralhar Fisher-Yates é semelhante a escolher aleatoriamente bilhetes numerados de um chapéu ou cartas de um baralho, um após o outro até que não haja mais. O que o algoritmo específico fornece é uma maneira de fazer isso numericamente, de maneira eficiente e rigorosa que, feita corretamente, garante um resultado imparcial ...

A solução ... moderna é mover os números "atingidos" para o final da lista, trocando-os pelo último número não detectado em cada iteração. Isso reduz a complexidade do tempo do algoritmo para O (n), em comparação com O (n 2 ) para a implementação ingênua. Essa alteração fornece o seguinte algoritmo (para uma matriz baseada em 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]
mosquito
fonte