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?


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]
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.