← Blog

Como funcionam os geradores de números aleatórios e como saber se um é justo

Quando você clica em "Gerar" em um gerador de números aleatórios, um computador, que foi projetado para seguir instruções com precisão, produz algo que ninguém consegue prever. Este guia explica como isso funciona, a forma mais comum de um gerador ser sutilmente injusto e como avaliar se os resultados são aleatórios.

Três tipos de aleatoriedade

Geradores de números pseudoaleatórios

Um gerador de números pseudoaleatórios (PRNG, na sigla em inglês) é uma fórmula. Ele parte de um valor chamado semente (seed) e o transforma repetidamente para produzir uma sequência que parece aleatória. Com a mesma semente, ele produz exatamente a mesma sequência outra vez. Isso é útil para simulações e videogames que precisam de resultados reproduzíveis.

O Math.random() do JavaScript é um PRNG. Ele serve bem para animações e jogos casuais. No entanto, os navegadores não garantem que sua saída seja imprevisível, e a especificação não exige nenhum nível de qualidade em particular. Ele não deve ser usado para senhas, sorteios de prêmios ou qualquer situação em que alguém possa se beneficiar ao adivinhar o próximo resultado.

Geradores criptograficamente seguros

Um PRNG criptograficamente seguro (CSPRNG) é projetado para que conhecer as saídas anteriores não ajude a prever a próxima. Os sistemas operacionais o alimentam a partir de eventos físicos imprevisíveis, como o ruído de temporização do hardware, e continuam misturando nova entropia. Nos navegadores, ele está disponível pela Web Crypto API como crypto.getRandomValues().

Geradores de números aleatórios por hardware

Um gerador por hardware mede um processo físico, como o ruído elétrico, e o converte em bits. Os processadores modernos incluem um, e os sistemas operacionais combinam a saída dele com outras fontes para alimentar o seu CSPRNG. A maioria das pessoas nunca precisa acessá-lo diretamente.

O que a Randomify usa: todo resultado é obtido com crypto.getRandomValues() no seu próprio navegador, recurso compatível com todos os navegadores atuais. Os números são gerados no seu dispositivo, e as listas que você digita não são enviadas para gerar um resultado.

A injustiça escondida: o viés do módulo

Uma fonte aleatória fornece bits, não "um número de 1 a 6". É na conversão de uma coisa na outra que muitos geradores erram.

Suponha que uma fonte produza um byte aleatório, um número inteiro de 0 a 255, e que um programa precise de uma rolagem de dado. O atalho é pegar o resto da divisão por 6 e somar 1. Mas 256 não é múltiplo de 6: 256 = 42 × 6 + 4. Os restos 0, 1, 2 e 3 podem ser produzidos de 43 maneiras cada, enquanto 4 e 5 só podem ser produzidos de 42. As faces de 1 a 4 ficam ligeiramente mais prováveis do que 5 e 6.

A diferença é pequena, 43/256 em vez de 42/256, mas é um viés sistemático, e não uma variação aleatória. Quanto maior o intervalo em relação à fonte, maior o viés.

A solução é a amostragem por rejeição: descartar qualquer valor bruto que caia no último bloco incompleto e sortear de novo. No exemplo do byte, só os valores de 0 a 251 são aceitos, então cada face tem exatamente 42 maneiras de ocorrer. A Randomify usa valores de 32 bits com amostragem por rejeição, de modo que todos os números do seu intervalo são igualmente prováveis.

Experimente com qualquer intervalo:

Experimente: Gerador de Números Aleatórios
Carregando ferramenta…

Embaralhar de forma justa

Sortear nomes de uma lista ou dividir pessoas em times exige um embaralhamento justo: todas as ordens possíveis devem ser igualmente prováveis.

O método padrão é o embaralhamento de Fisher–Yates. Começando pelo último item, troque-o com um item escolhido de forma uniformemente aleatória entre os que ainda não foram fixados, incluindo ele mesmo, e depois avance uma posição para a esquerda. Com n itens, ele produz cada uma das n! ordens possíveis com a mesma probabilidade.

Um atalho popular é ordenar a lista usando comparações aleatórias. Isso não produz ordens igualmente prováveis, e o viés depende do algoritmo de ordenação. O sorteador de nomes e o gerador de times da Randomify usam Fisher–Yates.

Resultados aleatórios parecem menos aleatórios do que as pessoas esperam

As pessoas tendem a esperar que sequências aleatórias se alternem mais do que realmente se alternam. Uma sequência aleatória de verdade contém sequências repetidas, agrupamentos e repetições.

Lançamentos de uma moeda justaProbabilidade de pelo menos uma sequência de…Chance
103 resultados iguais seguidos82,6%
104 resultados iguais seguidos46,5%
1005 resultados iguais seguidos97,2%
1006 resultados iguais seguidos80,7%
1007 resultados iguais seguidos54,2%

Portanto, uma sequência de seis caras em cem lançamentos não é sinal de problema; a ausência dela seria mais surpreendente. O mesmo vale para um gerador de números aleatórios que devolve o mesmo número duas vezes seguidas. Com um intervalo de 1 a 10, isso acontece em cerca de um sorteio a cada dez.

Experimente você mesmo: lance 100 moedas de uma vez e procure a sequência mais longa.

Como verificar se um gerador é justo

Não dá para provar que um gerador é justo com poucos resultados, mas é possível procurar problemas evidentes:

  1. Colete muitos resultados. Amostras pequenas variam muito. Para um gerador de 1 a 6, colete centenas ou milhares de sorteios, não vinte.
  2. Compare as frequências com o esperado. Cada valor deve aparecer mais ou menos com a mesma frequência. Os estatísticos usam o teste qui-quadrado para medir se as diferenças são maiores do que o acaso normalmente produziria.
  3. Observe as sequências, não só as contagens. Um gerador poderia produzir frequências perfeitas repetindo o ciclo 1, 2, 3, 4, 5, 6. Verifique também as repetições e as sequências.
  4. Pergunte como ele funciona. Uma ferramenta confiável deve informar qual fonte aleatória usa e como a converte para um intervalo.

Para usos de alto risco, como chaves de segurança, sorteios regulamentados por lei ou amostragem científica, use um gerador documentado que atenda à norma aplicável e mantenha um registro do processo.

Perguntas frequentes

O número aleatório de um computador é realmente aleatório? Um CSPRNG é determinístico depois de receber a semente, mas essa semente vem de imprevisibilidade física, e na prática sua saída não pode ser prevista sem o estado interno. Para sorteios do dia a dia, jogos e senhas, é a escolha certa.

Posso reproduzir um resultado depois? Não com um gerador criptográfico, e isso é intencional. Para tornar um sorteio verificável, grave a tela ou tenha testemunhas presentes, como descrito em como organizar um sorteio online justo.

Por que saiu o mesmo número duas vezes? Porque cada sorteio é independente. Desative as repetições se precisar que todos os resultados sejam diferentes, por exemplo, ao sortear vários vencedores.

Experimente estas ferramentas