Como embaralhar uma lista sem viciar
Atualizado em 14 de agosto de 2026
Embaralhar parece a coisa mais simples do mundo: troque tudo de lugar aleatoriamente e pronto. É por isso que o erro clássico do embaralhamento sobrevive há décadas em código de produção — ele parece certo, funciona, e o defeito só aparece se você contar.
O jeito correto: Fisher-Yates
Pense em cartas na mão, viradas para baixo. O algoritmo é:
- Pegue a última carta da pilha.
- Sorteie uma posição entre a primeira e essa última, inclusive.
- Troque as duas cartas de lugar.
- Considere a última carta “pronta” e repita com a pilha que sobrou, uma carta menor.
O detalhe crucial está no passo 2: o sorteio acontece apenas entre as posições ainda não finalizadas. Uma carta que já foi colocada em posição definitiva nunca é mexida de novo.
Por que isso importa: com dez itens, existem 3.628.800 ordens possíveis. Fisher-Yates faz nove sorteios, o primeiro entre 10 opções, o seguinte entre 9, depois 8, e assim por diante. 10 × 9 × 8 × ... × 2 = 3.628.800 — exatamente o número de ordens possíveis, cada caminho levando a uma ordem diferente. Nenhuma ordem é favorecida.
O jeito errado, que parece idêntico
A variação ingênua muda uma coisa só: em vez de sortear entre as posições restantes, sorteia entre todas as posições da lista, sempre.
Em código, é a diferença entre RNG.int(i + 1) e RNG.int(n). Um caractere. E o resultado é mensuravelmente enviesado.
A conta mostra por quê: com dez itens, essa versão faz dez sorteios entre dez opções cada, o que dá 1010 caminhos possíveis, ou seja 10 bilhões. Esses 10 bilhões de caminhos precisam se distribuir entre 3.628.800 ordens, e 10.000.000.000 não é divisível por 3.628.800. Como cada caminho tem a mesma probabilidade e a divisão não é exata, é matematicamente impossível que todas as ordens saiam com a mesma chance.
O efeito prático, com lista pequena, é que os itens tendem a ficar mais perto da posição original do que deveriam. Com três itens, uma das seis ordens sai em 7 de 27 casos em vez de 4,5 de 27 — um desvio de mais de 50% para essa ordem específica.
Esse bug foi encontrado em código de embaralhamento de grandes empresas mais de uma vez. Não é curiosidade acadêmica: é o que acontece quando ninguém contou.
Ordenar por número aleatório: por que evitar
Existe um terceiro método popular por ser curto: dar um número aleatório a cada item e ordenar a lista por esse número. Em JavaScript, aparece como array.sort(() => Math.random() - 0.5).
Duas coisas dão errado. A primeira é que uma função de comparação que responde diferente para o mesmo par viola o que o algoritmo de ordenação espera; o resultado depende da implementação interna e é conhecidamente desigual em vários navegadores. A segunda é que, mesmo com uma chave aleatória fixa por item — que é a versão correta dessa ideia — é preciso cuidar de empates, e a qualidade fica dependendo do tamanho do espaço de chaves.
Como Fisher-Yates tem cinco linhas, é mais rápido e é comprovadamente uniforme, não há motivo para escolher a alternativa.
O que isso muda para você
Se você usa uma ferramenta para embaralhar, não tem como inspecionar o código dela. O que dá para fazer é preferir ferramentas que dizem qual algoritmo usam, porque quem escreveu “usamos Fisher-Yates com rejeição” pelo menos sabe que a distinção existe.
O nosso embaralhar lista faz a versão correta, com números do gerador criptográfico do navegador e conversão por rejeição, sem o viés do resto da divisão explicado em o que é aleatório de verdade.
E se você quiser conferir
Dá para testar qualquer embaralhador sem ler o código. Use uma lista de três itens, embaralhe algumas centenas de vezes e anote quantas vezes cada uma das seis ordens apareceu. Se o embaralhamento é uniforme, os seis números ficam próximos, com a variação natural de amostra. Se alguma ordem aparece sistematicamente mais que as outras — e o desvio persiste ao aumentar o número de repetições — há viés.
É trabalhoso na mão, mas é exatamente o teste que separa “acho que está certo” de “conferi”. Com três itens e 600 repetições, esperar cerca de 100 para cada ordem é uma boa referência.