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 oMath.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.
Ferramentas Semelhantes
Reportar um Problema
Gerador de Números Aleatórios
Comentários
Ainda não há comentários — seja o primeiro a escrever um!