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 é:

  1. Pegue a última carta da pilha.
  2. Sorteie uma posição entre a primeira e essa última, inclusive.
  3. Troque as duas cartas de lugar.
  4. 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.

Resumo: Fisher-Yates sorteando só entre as posições restantes, números de gerador criptográfico e conversão por rejeição. Qualquer atalho nessas três partes introduz viés pequeno, invisível e real.

Leia depois