Dia a dia

Sorteador aleatório de nomes e itens

Uma entrada por linha e depois escolha o que fazer com elas. O sorteio usa crypto.getRandomValues(), a mesma fonte de aleatoriedade que os navegadores usam para chaves de criptografia, em vez do embaralhamento comum que quase toda página usa e que, como explicam as notas abaixo, não é realmente aleatório.

Só no modo Sortear. Cada sorteio devolve essa quantidade de entradas diferentes.

Só no modo Dividir. Os tamanhos ficam com diferença máxima de uma entrada.

As linhas em branco são sempre ignoradas e os espaços das pontas são removidos. Apagar os vencedores é como você faz várias rodadas sem que ninguém ganhe duas vezes.

Adicione algumas linhas para começar.

O embaralhamento que quase todo mundo escreve está errado

Procure como embaralhar uma lista em JavaScript e a primeira resposta costuma ter uma linha só: ordenar o array com um comparador que devolve um número aleatório. É curta, parece engenhosa e não produz uma ordem aleatória.

Um algoritmo de ordenação parte do princípio de que o comparador é coerente: que, se foi dito que A vem antes de B, isso continua valendo. Dê a ele um cara ou coroa e o resultado depende inteiramente de quais pares aquele algoritmo específico compara, e em que ordem. A distribuição não é uniforme e o viés não é sutil: os itens tendem a terminar perto de onde começaram, e o padrão muda de navegador para navegador porque as implementações de ordenação são diferentes.

O algoritmo certo é o Fisher-Yates, e ele não é mais difícil. Percorra a lista da última posição para trás. A cada passo, escolha uma posição aleatória naquele ponto ou antes dele e troque os dois itens. Todas as ordens possíveis saem com a mesma probabilidade, cada item é tocado uma única vez e é isso que roda quando você aperta Embaralhar aqui em cima.

De onde vem a aleatoriedade

Math.random() é um gerador pseudoaleatório: uma fórmula fixa, semeada uma única vez, que produz uma sequência que parece aleatória e é completamente determinada por essa semente. É rápido e perfeitamente adequado para dar variação a uma animação. Mas não foi projetado para ser imprevisível: com saídas consecutivas suficientes, dá para reconstruir seu estado interno e deduzir os próximos valores.

Esta ferramenta usa crypto.getRandomValues(), que tira os dados da fonte de aleatoriedade criptográfica do sistema operacional, a mesma usada para gerar chaves de criptografia. Para decidir quem paga o café, é exagero. Para um sorteio em que alguém leva alguma coisa, elimina uma categoria inteira de discussão e não custa nada.

A armadilha do módulo

Conseguir um número aleatório entre 0 e 4 bilhões é fácil; transformá-lo em um número entre 0 e 9 é onde as pessoas escorregam. O movimento óbvio é pegar o resto da divisão por 10. Mas 2^32 não é múltiplo de 10, então o pedaço que sobra no topo da faixa deixa os primeiros resultados um pouquinho mais prováveis que os demais. Com listas desse tamanho, o efeito é pequeno demais para alguém notar. Ainda assim vale a pena corrigir: descarte qualquer valor que caia nesse bloco final incompleto e sorteie de novo. Isso é um sorteio extra em casos raríssimos, em troca de uma distribuição exatamente uniforme em vez de quase uniforme.

O aleatório não parece aleatório

Sorteie um nome entre vinte, devolva-o à lista e sorteie de novo: há uma chance em vinte de sair o mesmo nome duas vezes. As pessoas leem isso como defeito. É o contrário: um gerador que se recusasse a repetir seria o enviesado. Se você precisa de vários vencedores diferentes, aumente "quantas sortear" — um único sorteio sempre devolve entradas diferentes — ou ligue "apagar os vencedores da lista" e faça as rodadas uma de cada vez.

O mesmo instinto produz a falácia do apostador no sorteio do escritório. Ninguém "está na vez". Cada sorteio ignora completamente o anterior, e o único jeito de dar mais chance a alguém é colocar essa pessoa na lista mais de uma vez, que também é a única ponderação que esta ferramenta aceita. Duas linhas com o mesmo nome dão o dobro de chance; só lembre de desmarcar "ignorar linhas repetidas" antes, porque essa opção existe para limpar dados colados.

Dividir em times

O modo Dividir embaralha a lista inteira e depois distribui as entradas uma a uma, como se fossem cartas. Isso mantém os grupos com diferença máxima de um integrante mesmo quando a lista não divide de forma exata, e faz com que as pessoas que sobram sejam escolhidas ao acaso em vez de serem sempre as que estavam no fim da lista. É aleatório, não equilibrado: a ferramenta não sabe nada sobre habilidade, tempo de casa ou quem não pode ficar no mesmo grupo que quem.

O que ele não faz por você

Perguntas frequentes

É aleatório de verdade?

Usa crypto.getRandomValues(), a fonte de aleatoriedade criptográfica do seu navegador, combinada com um embaralhamento Fisher-Yates e amostragem por rejeição, de modo que nenhuma entrada fica nem um pouco favorecida. É uma garantia mais forte que a da maioria dos sites de sorteio, que usam Math.random() e um embaralhamento baseado em ordenação.

O mesmo nome pode sair duas vezes?

Dentro de um mesmo sorteio, não: pedir três dá três entradas diferentes. Entre sorteios separados, pode sim, porque cada sorteio começa do zero. Marque "apagar os vencedores da lista" para fazer várias rodadas sem repetição.

Dá para deixar uma entrada com mais chance de ganhar?

Só incluindo a entrada mais de uma vez, e você vai precisar desmarcar "ignorar linhas repetidas" para que isso conte. Não há campo de peso nem de porcentagem, o que é um limite deliberado e não um esquecimento.

Minha lista é enviada para algum lugar?

Não. A página não faz nenhuma requisição de rede depois de carregar, o sorteio roda na sua aba e nada é armazenado. Recarregar a página apaga a lista, então copie o que precisar guardar.

Posso usar isto para sortear um prêmio?

O sorteio é justo, mas não produz nenhuma evidência disso. Não há registro, nem semente, nem carimbo de data, então, se os participantes puderem contestar o resultado, grave a tela enquanto sorteia ou use um serviço feito para sorteios verificáveis.

Última atualização 19 de setembro de 2026