Gerador de Números Aleatórios

Gere um ou vários números aleatórios em qualquer intervalo, com ou sem repetição — usando aleatoriedade criptográfica.

1.447 visualizações

Como os Números São Realmente Gerados

Nem todo "aleatório" é igual. O Math.random(), disponível em todos os navegadores, é um gerador pseudoaleatório rápido — determinístico por baixo dos panos e, em princípio, previsível para quem conhece seu estado interno, o que o torna inadequado para qualquer coisa sensível à segurança, como sorteios com resultados reais em jogo. Esta ferramenta usa, em vez disso, o crypto.getRandomValues(), o gerador aleatório criptograficamente seguro embutido no navegador, que extrai das fontes de entropia do sistema operacional e não é previsível nem mesmo em princípio.

Ter uma fonte aleatória segura resolve apenas metade do problema, porém. Mapear um valor aleatório para um intervalo específico (digamos, 1-100) de forma ingênua — pegando aleatório % 100 — introduz um viés de módulo sutil, mas real: como o intervalo bruto de saída do gerador geralmente não é um múltiplo exato de 100, alguns restos acabam sendo ligeiramente mais prováveis do que outros. O viés é pequeno, mas é real e se acumula ao longo de muitos sorteios — exatamente o tipo de coisa que não deveria existir em uma rifa supostamente justa.

A solução é a amostragem por rejeição: em vez de forçar cada valor bruto a caber no intervalo via módulo, os valores brutos fora do intervalo são descartados e um novo é sorteado até que se encaixe perfeitamente em um múltiplo exato do intervalo alvo. Isso garante uma distribuição verdadeiramente uniforme — cada número no intervalo tem exatamente a mesma probabilidade — ao custo de ocasionalmente precisar de um ou dois sorteios extras, o que é imperceptível nas velocidades envolvidas.

Escolha um mínimo, um máximo e quantos números são necessários; marque único para evitar repetições, o que é o que rifas, sorteios de prêmios, amostragens e jogos precisam quando a mesma entrada não deve ganhar duas vezes. Tudo roda no dispositivo local — nenhum número é transmitido ou armazenado em lugar nenhum, e atualizar a página produz um sorteio completamente novo.

Coisas Que Vale a Pena Saber

  • O viés de módulo é invisível em poucos sorteios, mas se torna estatisticamente detectável ao longo de milhares — a amostragem por rejeição o remove completamente, em vez de apenas reduzi-lo.
  • O crypto.getRandomValues() ser "criptograficamente seguro" significa que sua saída não pode ser prevista nem mesmo por alguém que já tenha visto saídas anteriores — uma propriedade que o Math.random() explicitamente não tem e nunca foi projetado para ter.
  • O intervalo é inclusivo em ambas as pontas: um sorteio de 1-10 pode produzir tanto 1 quanto 10, não apenas os valores estritamente entre eles.
  • Para um sorteio auditável, numere os participantes de 1 a N, ajuste o intervalo de acordo, ative único e tire um print do resultado, já que nada é armazenado no servidor após o sorteio.

Perguntas Frequentes

Os números são realmente aleatórios, ou apenas "aleatórios o suficiente"?

Eles vêm do crypto.getRandomValues(), que se baseia na fonte de entropia criptográfica do sistema operacional - imprevisível em princípio, não apenas na prática, ao contrário do simples Math.random() usado pela maioria dos scripts de números aleatórios comuns.

O que é viés de módulo, e esta ferramenta o tem?

Mapear ingenuamente um valor aleatório para um intervalo com aleatório % N favorece ligeiramente alguns números em detrimento de outros, porque o intervalo bruto do gerador geralmente não é um múltiplo exato de N. Esta ferramenta evita isso com amostragem por rejeição: valores brutos fora do intervalo são descartados e sorteados novamente até que um resultado uniforme seja garantido.

O que é amostragem por rejeição, em termos simples?

Em vez de forçar cada valor aleatório a caber em um intervalo com uma operação de módulo, os valores que introduziriam viés são simplesmente descartados e um novo é sorteado - repetindo até que apareça um valor que se encaixe perfeita e uniformemente no intervalo. O custo é um sorteio extra ocasional; o benefício é um resultado verdadeiramente uniforme.

Posso usar isso para um sorteio de prêmios?

Sim. Numere os participantes de 1 a N, ajuste o intervalo de acordo, ative único e gere quantos vencedores forem necessários. Tire um print para os registros, já que os resultados não são armazenados em lugar nenhum após o sorteio.

O mínimo e o máximo estão ambos incluídos no intervalo?

Sim - o intervalo é inclusivo em ambas as pontas. Um sorteio de 1-10 pode produzir tanto 1 quanto 10, exatamente como aconteceria se papéis numerados fossem sorteados de um chapéu.

Comentários

Ainda não há comentários — seja o primeiro a escrever um!

Ferramentas Semelhantes