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?
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?
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 1do
j ← random integer with0≤ j ≤ i
exchange a[j]and a[i]
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.
fonte