
No cotidiano, "aleatório" significa imprevisível. Em matemática e computação, aleatoriedade tem um significado preciso: uma sequência é aleatória se conhecer todos os valores anteriores não oferece nenhuma vantagem para prever o próximo. Obter verdadeira aleatoriedade em uma máquina determinística é fundamentalmente difícil — computadores seguem instruções exatas, o que é o oposto da imprevisibilidade. As soluções para esse problema se dividem em duas grandes categorias: geradores de números pseudoaleatórios (PRNGs) e geradores de números verdadeiramente aleatórios (TRNGs).
Um PRNG é um algoritmo determinístico que produz uma sequência de números que parece aleatória, mas é inteiramente determinada por um valor inicial chamado semente. Dada a mesma semente, um PRNG sempre produz a mesma sequência. Isso pode parecer uma falha, mas é na verdade uma propriedade útil em muitos contextos.
O PRNG moderno mais amplamente utilizado é o Mersenne Twister, que tem um período de 2^19937 − 1 (ou seja, ele produz essa quantidade de valores antes de repetir). Ele passa em quase todos os testes estatísticos de aleatoriedade. A maioria das funções aleatórias de uso geral em linguagens de programação — o módulo random do Python, o java.util.Random do Java, o Math.random() do JavaScript — usa um PRNG por baixo dos panos.
A limitação crítica: PRNGs não são criptograficamente seguros. Se um invasor conseguir observar um número suficiente de saídas, ele pode reconstruir o estado interno e prever todas as saídas futuras. Para qualquer coisa sensível à segurança, PRNGs não devem ser usados.
Um CSPRNG é um PRNG projetado para ser computacionalmente inviável de prever, mesmo com conhecimento de saídas anteriores. Ele alcança isso por meio de funções criptográficas unidirecionais e é alimentado por uma fonte de entropia genuína. Os sistemas operacionais fornecem CSPRNGs por meio de interfaces como /dev/urandom no Linux/macOS e CryptGenRandom no Windows.
No código da aplicação:
secrets (use este, não o random, para senhas e tokens)crypto.randomBytes() e crypto.randomUUID()window.crypto.getRandomValues()java.security.SecureRandomSempre use a API de aleatoriedade criptográfica para operações sensíveis à segurança: geração de senhas, tokens, IDs de sessão, chaves de API, chaves criptográficas e nonces.
TRNGs derivam aleatoriedade de processos físicos genuinamente imprevisíveis: ruído térmico em componentes eletrônicos, decaimento radioativo, ruído atmosférico ou tempos de chegada de fótons. Módulos de segurança de hardware (HSMs) usados em bancos e autoridades certificadoras incluem TRNGs. Serviços como o random.org geram números aleatórios a partir de ruído atmosférico e são frequentemente usados como fontes de aleatoriedade verificavelmente justas para loterias e sorteios.
Os CSPRNGs do sistema operacional geralmente se alimentam de fontes de entropia de hardware (temporização de teclado, E/S de disco, chips de hardware RNG como o RDRAND da Intel) e depois usam um algoritmo CSPRNG para expandir essa entropia em um fluxo. Essa abordagem híbrida combina a imprevisibilidade da entropia de hardware com a velocidade da geração por software.
Math.random() ou equivalente para isso.Quando a reprodutibilidade é importante — recriar um cenário de teste específico, compartilhar um resultado gerado, depurar uma simulação — você pode alimentar um PRNG com um valor fixo e sempre obter a mesma saída. Muitos jogos usam uma semente para a geração de mundos, permitindo que jogadores compartilhem sementes de mapas interessantes. Pesquisadores de machine learning frequentemente alimentam bibliotecas aleatórias no início de um experimento para garantir resultados reproduzíveis entre execuções.
A qualidade da sua semente também importa. Um PRNG alimentado com o timestamp atual em milissegundos é previsível se um invasor sabe aproximadamente quando sua aplicação foi iniciada. Para fins não relacionados à segurança, uma semente de timestamp geralmente é suficiente; para qualquer coisa em que a saída deva ser impossível de adivinhar, use um CSPRNG para gerar a semente.
Abra o gerador de números aleatórios gratuito — gere um ou vários números aleatórios em qualquer intervalo, com ou sem repetição. Funciona no seu navegador.