Você aperta um botão, aparece um número e assume que ele é aleatório. A pergunta que vale fazer é o que o produziu — porque uma das duas respostas é verificável e a outra não.
De Onde Vem a Aleatoriedade Genuína
A aleatoriedade de verdade vem de processos físicos que não são determinados pelo estado anterior:
- Decaimento radioativo — o instante exato em que um átomo decai não pode ser previsto
- Ruído térmico — flutuações aleatórias de tensão em um resistor
- Ruído atmosférico — o chiado de fundo da atividade de raios
- Medição quântica — resultados genuinamente indeterminados
Isso não são aproximações de aleatoriedade. São aleatórios, no sentido de que nenhuma quantidade de conhecimento sobre o passado determina o resultado.
O Que um Computador Faz no Lugar Disso
Um computador não consegue observar nada disso diretamente, então um gerador de hardware faz a amostragem. Os bytes brutos vêm de algo como /dev/urandom ou da fonte equivalente do sistema operacional, que por sua vez é semeada a partir de processos físicos. Esse é um gerador de números verdadeiramente aleatórios.
O caso muito mais comum é o gerador pseudoaleatório: um algoritmo determinístico que produz uma sequência que apenas parece aleatória.
next = (previous × multiplier + increment) mod modulus
A propriedade crítica não é sutil. Se você conhece o algoritmo e a semente, consegue calcular todo valor que a sequência vai produzir. Não aproximadamente — exatamente.
É por isso que Math.random(), usado por quase todo site, não serve para nada que importe. A saída é determinada pelo estado interno. Recupere esse estado a partir das saídas observadas e todo resultado futuro fica previsível.
O exemplo mais citado é que o estado completo de um gerador congruente linear pode ser recuperado a partir de algumas saídas consecutivas. O Mersenne Twister, padrão em Python, precisa de 624 saídas para ser reconstruído — e 624 é um número que você alcança em segundos.
O Xorshift e geradores rápidos parecidos têm a mesma propriedade de outra forma: qualidade estatística excelente, totalmente previsíveis se você tiver o estado.
O Meio-Termo que Realmente Importa
Esta é a parte que a maioria das explicações pula, e é a que decide a resposta na prática.

As plataformas web modernas não usam /dev/urandom bruto a cada chamada. Elas usam um PRNG criptograficamente seguro — um algoritmo determinístico, mas semeado a partir de entropia de hardware e projetado para que observar as saídas não permita recuperar o estado.
Vale ser preciso sobre a distinção, porque as duas coisas costumam ser confundidas:
| TRNG de hardware | CSPRNG | PRNG comum | |
|---|---|---|---|
| Baseado em entropia física | Sim | Sim | Não |
| Determinístico dado o estado | Não | Sim | Sim |
| A saída revela o estado | Não | Não | Sim |
| Adequado para um sorteio de prêmios | Sim | Sim | Não |
Um CSPRNG é determinístico no mesmo sentido em que todo software que você usa é determinístico. O que o torna aceitável é que o estado não é recuperável a partir do que ele já emitiu.
Os navegadores expõem exatamente isso por meio de crypto.getRandomValues(). É a fonte da qual o RandomSelect sorteia.
Justiça é uma Segunda Questão
A uniformidade é fácil de errar mesmo com uma boa fonte. Um d6 é simples: seis valores igualmente prováveis. Um d7 não é, e “escolher 1 entre 40 nomes” também não.
A abordagem ingênua — escalar um número de ponto flutuante de 0 a 1 para o intervalo — enviesa a extremidade inferior. Com 40 nomes, o primeiro apareceria um pouco mais vezes que o último, porque alguns valores aleatórios caem além do fim do último bloco e são descartados de forma desigual.
A abordagem correta é a amostragem por rejeição: sorteie e, se o resultado cair no bloco final incompleto, descarte e sorteie de novo. A distribuição fica exatamente uniforme.
Isso é fácil de passar despercebido porque o viés é pequeno. Na prática, a implementação rejeita valores fora do intervalo e sorteia de novo, então cada entrada tem exatamente 1/N de chance — inclusive em um sorteio de 40 nomes, em que uma implementação de ponto flutuante escalado daria ao primeiro nome uma probabilidade um pouco maior.
A mesma técnica aparece no gerador de IDs curtos, em que o comentário no código anota a taxa de aceitação e o viés resultante de cerca de duas partes em dez milhões. Pequeno o bastante para ser irrelevante, e pequeno o bastante para que uma implementação descuidada passasse despercebida — que é exatamente o motivo de medi-lo.
O Que Isso Significa na Prática
Para escolher o almoço, nada disso importa. Qualquer gerador produz um almoço aceitável.
Para um sorteio de prêmios, uma atribuição de funcionários ou qualquer coisa que envolva reputação, a questão é se a saída poderia ter sido antecipada. Com Math.random() poderia, em princípio. Com crypto.getRandomValues() não — e essa é a diferença entre “dizemos que foi aleatório” e “o mecanismo garante que é”.
Há um ponto relacionado e frequentemente mal compreendido sobre a animação. Em uma roleta giratória, o resultado é definido antes de a roleta começar a girar; a animação se desenrola em direção a ele. Alguns leitores interpretam isso como prova de manipulação. É o contrário: como o resultado já está determinado e não pode ser influenciado pelo tempo, não há entrada para ninguém explorar. O visual é encenação sobre um valor que já está fixado.
Testando Você Mesmo
Um exercício rápido que não precisa de código: jogue um dado vinte vezes e anote os resultados. Depois procure sequências.
Você vai encontrá-las. Três seis seguidos acontecem mais ou menos uma vez a cada cinquenta jogadas. Isso não é sinal de que o dado está viciado — é a cara de um processo justo quando você examina uma amostra curta.
Depois jogue cem vezes e conte cada face. As diferenças diminuem. Ninguém está convergindo, porque nunca houve déficit a fechar: é isso que independência significa quando você olha de perto o bastante.
Onde Ler Mais
A página de imparcialidade deste site percorre a implementação real, incluindo a etapa de amostragem por rejeição. Vale a pena ler uma vez, principalmente se você está escolhendo uma ferramenta para uma decisão que será questionada.
O resumo prático é curto: uma ferramenta que usa crypto.getRandomValues() e rejeita sorteios fora do intervalo está fazendo a coisa certa, e você não precisa acreditar na palavra dela — pode raciocinar sobre o mecanismo.