Embaralhar linhas

Reordene linhas ao acaso (Fisher-Yates) para listas e sorteios locais.

Descrição

Embaralhar dados ao acaso é mais difícil do que parece. O algoritmo mais ingênuo — gerar um número aleatório para cada elemento e reordenar por esse valor — produz distribuições enviesadas em que certas posições aparecem com mais frequência do que deveriam. O Fisher-Yates shuffle, formalizado por Ronald Fisher e Frank Yates em 1938 e popularizado na versão computacional por Richard Durstenfeld em 1964, resolve isso de forma elegante: percorre a lista de trás para frente e troca cada elemento com um escolhido ao acaso entre os ainda não processados. O resultado é uma permutação verdadeiramente uniforme em O(n).

A qualidade da aleatoriedade depende do gerador usado. O Math.random() dos motores JavaScript modernos usa algoritmos como xorshift128+ e produz números suficientemente imprevisíveis para casos de uso comuns: embaralhar cartões de estudo, randomizar a ordem de perguntas, criar amostras para testes manuais. Para sorteios com requisitos legais ou de auditoria — rifas, competições esportivas, decisões de governança — a fonte correta é a Web Crypto API: window.crypto.getRandomValues() usa entropia do sistema operacional e é criptograficamente forte.

Existe um paradoxo interessante na percepção humana de aleatoriedade. Quando a Spotify lançou o shuffle aleatório real em suas playlists, os usuários reclamavam que não funcionava — porque músicas do mesmo artista apareciam em sequência com frequência, o que é estatisticamente esperado numa distribuição uniforme. Para parecer mais aleatório para as pessoas, a Spotify teve que tornar o shuffle deliberadamente menos aleatório, garantindo maior espaçamento entre artistas. A percepção humana de acaso é profundamente não uniforme.

Detalhamento técnico

Aplicações práticas do embaralhamento

  • Flashcards e estudos: embaralhar uma lista de palavras, fórmulas ou perguntas antes de cada sessão de estudo evita que o cérebro memorize a sequência em vez do conteúdo.
  • Testes e questionários: randomizar a ordem das perguntas e alternativas em provas reduz cola e garante que versões diferentes do mesmo teste sejam equivalentes em dificuldade.
  • Playlists e sistemas de recomendação: selecionar aleatoriamente um subconjunto de itens de uma lista maior para exibição é a operação de amostragem sem reposição, que Fisher-Yates executa com eficiência.
  • Divisão de datasets em machine learning: embaralhar os dados antes de dividir em conjuntos de treino, validação e teste evita viés de ordenação que distorce as métricas do modelo.
  • Sorteios e games: determinar a ordem de jogadores, cartas ou prêmios com uma fonte de aleatoriedade confiável, registrando a semente para auditoria posterior se necessário.

Math.random() versus window.crypto.getRandomValues()

  • Math.random() é suficiente para embaralhar flashcards, randomizar listas de exibição e testes de UI. É rápido e disponível em todos os contextos JavaScript.
  • window.crypto.getRandomValues() usa entropia do sistema operacional (ruído de hardware, timings de interrupções) e é criptograficamente adequado para sorteios com valor real.
  • A diferença prática: se um adversário puder observar os resultados anteriores do Math.random() e conhecer o algoritmo, em teoria pode prever os próximos valores. O getRandomValues() não tem esse problema.
  • Para uso em Node.js, o equivalente é crypto.getRandomValues() ou crypto.randomBytes(). Para Python, use random.shuffle() para casos simples e secrets para aplicações com requisitos de segurança.

Guia da ferramenta

  • O objeto tratado Lista em texto, uma entrada por linha.

  • O que a ferramenta faz Reordena as linhas aleatoriamente (algoritmo tipo Fisher-Yates com aleatoriedade do navegador).

  • Por que usar Sorteios informais, ordem aleatória de itens em testes A/B manuais, quebra de viés de listas sempre na mesma ordem.

Exemplo de Código

Fisher-Yates shuffle em JavaScript
function shuffleLines(text) {
  const lines = text.split('\n');
  // Fisher-Yates: percorre de trás para frente
  for (let i = lines.length - 1; i > 0; i--) {
    const j = Math.floor(Math.random() * (i + 1));
    [lines[i], lines[j]] = [lines[j], lines[i]];
  }
  return lines.join('\n');
}
Versão com Web Crypto (criptograficamente segura)
function shuffleSecure(text) {
  const lines = text.split('\n');
  const arr = new Uint32Array(lines.length);
  crypto.getRandomValues(arr);
  return lines
    .map((line, i) => ({ line, rand: arr[i] }))
    .sort((a, b) => a.rand - b.rand)
    .map(item => item.line)
    .join('\n');
}

Uso

alfa
beta
gamma → ordem aleatória a cada embaralhada

Perguntas frequentes

Para que serve esta ferramenta?

Ela roda 100% no seu navegador: útil para validar, formatar ou converter dados no dia a dia de desenvolvimento.

Meus dados são enviados a algum servidor?

O processamento é feito localmente via JavaScript. Não armazenamos o conteúdo que você cola nas caixas de texto.

Posso usar em produção ou para dados reais?

Use por sua conta e risco. Para segredos (senhas, tokens), prefira ambientes controlados e políticas da sua empresa. E lembre sempre de revisar os conteúdos gerados. Nunca confie cegamente nas coisas que vê na internet.