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?
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?
Respostas:
O Python random.shuffle
usa 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]