Os números aleatórios são úteis para uma grande variedade de situações, como gerar chaves de criptografia de dados, simular e modelar fenômenos complexos e para selecionar amostras aleatórias de conjuntos de dados maiores.

Números aleatórios também têm sido usados ​​esteticamente, por exemplo, na literatura e na música e para jogos e apostas.

Porém, é comum usuários de computadores não compreenderem corretamente o “gerador de números aleatórios” de seu sistema e os “números aleatórios” que ele produz, sendo que na verdade ele trabalha com pseudo-aleatoriedade.

Conceitos

Vamos trabalhar um pouco a base conceitual sobre números sequências e aleatórios - randômicos, e pseudo-aleatoriedade.

Com o advento dos computadores, os programadores reconheceram a necessidade de um meio de introduzir aleatoriedade em um programa de computador. No entanto, por mais surpreendente que possa parecer, é difícil fazer com que um computador faça algo por acaso. Um computador segue suas instruções cegamente e, portanto, é totalmente previsível. (Um computador que não segue suas instruções dessa maneira está danificado.) Existem duas abordagens principais para gerar números aleatórios usando um computador: Geradores de Números Pseudo-Aleatórios (PRNGs) e Geradores de Números Aleatórios Verdadeiros (TRNGs). As abordagens têm características bastante diferentes e cada uma tem seus prós e contras.

Os números calculados por um computador por meio de um processo determinístico não podem, por definição, ser aleatórios.

Dado o conhecimento do algoritmo usado para criar os números e seu estado interno, você pode prever todos os números retornados por chamadas subsequentes ao algoritmo, enquanto com números genuinamente aleatórios, o conhecimento de um número ou de uma sequência arbitrariamente longa de números é inútil de qualquer maneira na previsão do próximo número a ser gerado.

Números “aleatórios” gerados por computador são mais apropriadamente chamados de números pseudo-aleatórios e sequências pseudo-aleatórias de tais números.

Uma variedade de algoritmos inteligentes foi desenvolvida para gerar sequências de números que passam em todos os testes estatísticos usados ​​para distinguir sequências aleatórias daquelas que contêm algum padrão ou ordem interna.

Número aleatório

Em matemática e estatística, um número aleatório é pseudo-aleatório ou um número gerado para, ou parte de, um conjunto que exibe aleatoriedade estatística.

Ao discutir números únicos, um número aleatório é aquele que é retirado de um conjunto de valores possíveis, cada um dos quais é igualmente provável, ou seja, uma distribuição uniforme.

No entendimento comum, todos números têm chances iguais de serem definidos; por outro lado, nenhum tem uma vantagem.

A definição de sequência aleatória aprofunda e esclarece:

Sequência aleatória

Ao discutir uma sequência de números aleatórios, cada número sorteado deve ser estatisticamente independente dos outros.

O conceito de sequência aleatória é essencial na teoria da probabilidade e na estatística. Para a estatística, um número aleatório é um número que pertence a uma série numérica e não pode ser previsto a partir dos membros anteriores da série. O conceito de número aleatório é um conceito relativo à série numérica a que o número pertence. Um número pode ser aleatório numa série numérica e não aleatório em outra.

Em conceitos teóricos, a teoria de probabilidade axiomática evita deliberadamente a definição de uma sequência aleatória. A teoria de probabilidade tradicional não afirma se uma sequência específica é aleatória, mas geralmente prossegue discutindo as propriedades de variáveis aleatórias e sequências estocásticas assumindo alguma definição de aleatoriedade.

Geração de sequências e números aleatórios

A geração de números aleatórios é um processo que gera uma sequência de números ou símbolos que não podem ser razoavelmente previstos melhor do que por uma chance aleatória.

Podem ser gerados por geradores de números aleatórios de hardware verdadeiramente aleatórios (HRNGS), que geram números aleatórios como uma função do valor atual de algum atributo do ambiente físico que está constantemente mudando de uma maneira que é praticamente impossível de modelar, ou geradores de números pseudo-aleatórios (PRNGS), que geram números que parecem aleatórios, mas são realmente determinísticos e podem ser reproduzidos se o estado do PRNG for conhecido.

Várias aplicações de aleatoriedade levaram ao desenvolvimento de vários métodos diferentes para gerar dados aleatórios, alguns dos quais existiram desde os tempos antigos, entre cujas fileiras estão conhecidos exemplos “clássicos”, incluindo o lançamento de dados, lançamento de moeda, o embaralhamento de cartas de jogar, o uso de talos de mil-folhas (para adivinhação) no I Ching, além de inúmeras outras técnicas.

Devido à natureza mecânica dessas técnicas, gerar grandes quantidades de números suficientemente aleatórios (importante nas estatísticas) exigia muito trabalho e tempo. Assim, os resultados às vezes eram coletados e distribuídos como tabelas de números aleatórios.

Existem vários métodos computacionais para geração de números pseudo-aleatórios. Todos ficam aquém do objetivo da verdadeira aleatoriedade, embora possam atender, com sucesso variável, alguns dos testes estatísticos de aleatoriedade destinados a medir o quão imprevisíveis são seus resultados (isto é, em que grau seus padrões são discerníveis).

Isso geralmente os torna inutilizáveis ​​para aplicativos como criptografia. No entanto, geradores de números pseudo-aleatórios (CSPRNGS) cuidadosamente projetados e criptograficamente seguros também existem, com recursos especiais projetados especificamente para uso em criptografia.

Geradores de números pseudo-aleatórios (PRNGs)

Como a palavra ‘pseudo’ sugere, os números pseudo-aleatórios não são exatamente aleatórios da maneira que você pode esperar, ao menos não da mesma maneira que você pode estar acostumado a jogar dados ou bilhetes de loteria.

Essencialmente, PRNGs são algoritmos que usam fórmulas matemáticas ou simplesmente tabelas pré-calculadas para produzir sequências de números que parecem aleatórias. Um bom exemplo de PRNG é o método congruencial linear.

Muita pesquisa e investimento foi feito na teoria a respeito de números pseudo-aleatórios, sendo que os algoritmos modernos para gera-los são tão bons que os números parecem realmente como se fossem verdadeiramente aleatórios.

A diferença básica entre PRNGs e TRNGs é fácil de compreender quando se comparam números aleatórios gerados por computador aos resultados de lançamentos de um dado.

Considerando que os PRNGs geram números aleatórios usando fórmulas matemáticas ou listas pré-calculadas, um método equivalente seria alguém jogar um dado muitas vezes e anotar os resultados. Sempre que você realizasse então uma jogada de dados, você obteria o próximo resultado na lista. Os resultados parecem aleatórios, mas são realmente predeterminados.

Já os TRNGs funcionam fazendo com que um computador realmente role o dado ou, mais comumente, use algum fenômeno físico mais fácil de conectar a um computador do que um dado.

PRNGs são eficientes, isto é, podem gerar muitos números em um curto espaço de tempo, e determinísticos, o que significa que uma determinada sequência de números pode ser reproduzida em uma data posterior se o ponto de partida da sequência for conhecido (seed ou semente).

A eficiência é uma boa característica se seu aplicativo precisa de uma quantidade muitos grande de números, e o determinismo é útil se você precisar reproduzir a mesma sequência de números novamente em um estágio ou contexto futuro.

Normalmente os PRNGs também são periódicos, isto é, são finitos. Isto significa que a sequência acabará se repetindo. Embora esta seja uma característica nem sempre desejável, os PRNGs modernos têm um período tão longo que pode ser ignorado para a maioria dos propósitos de aplicação prática.

Por todas essas características, os PRNGs acabam por serrem adequados em aplicações onde muitos números são necessários e onde é útil que a mesma sequência possa ser reproduzida facilmente.

Exemplos populares de tais aplicativos são sistemas de simulação e modelagem.

Os PRNGs entretanto, não são adequados para aplicações em que é necessários que os números sejam verdadeiramente imprevisíveis, como sistemas de criptografia, jogos de dados ou outros jogos de azar.

É importante compreender que, embora existam bons algoritmos PRNG, eles nem sempre são usados ​​pois é fácil obter surpresas indesejáveis.

Veja o exemplo da popular linguagem de programação da web PHP:

Se você usa PHP em distribuições do Sistema Operacional GNU/Linux, é provável que fique satisfeito com números aleatórios gerados pela linguagem.

No entanto, se você usar PHP para Microsoft Windows, provavelmente descobrirá que seus números aleatórios não gerados como esperado, conforme mostrado nesta análise visual de 2008.

Outro exemplo é do ano de 2002, quando um pesquisador relatou que o PRNG no MacOS não era bom o suficiente para simulação científica de infecções por vírus.

Não estou afirmando que estas situações se mantém até hoje, principalmente considerando as evoluções dos Sistemas Operacionais e linguagens de programação. A questão principal é queresultado, mesmo que um PRNG atenda às necessidades do seu aplicativo, deve ler avaliado com cuidado para não receber resultados fora do esperado para sua aplicação.

Geradores de números aleatórios verdadeiros (TRNGs)

Em comparação com os PRNGs, os TRNGs garantem a aleatoriedade utilizando fenômenos físicos e a introduzem em um computador. Você pode imaginar isso como um dado de rolar conectado a um computador.

Porém, normalmente, são utilizados um fenômenos físicos mais fácil de conectar a um computador do que um dado :-D.

O fenômeno físico pode ser muito simples, como as pequenas variações nos movimentos do mouse de alguém ou na quantidade de tempo entre os pressões realizadas nas teclas de um teclado ao se digitar.

Na prática, entretanto, você deve ter cuidado com o fenômeno e a fonte que escolher. Por exemplo, pode ser complicado usar pressionamentos de tecla dessa maneira, porque os pressionamentos de tecla são freqüentemente armazenados em buffer pelo sistema operacional do computador, o que significa que vários pressionamentos de tecla são coletados antes de serem enviados para o programa que está aguardando por eles. Para um programa que aguarda os pressionamentos de tecla, parecerá que as teclas foram pressionadas quase simultaneamente e pode não haver muita aleatoriedade neste processo.

Mas existem muitas outras maneiras de obter aleatoriedade verdadeira em seu computador.

Um fenômeno físico muito bom para ser usado é uma fonte radioativa. Os pontos no tempo em que uma fonte radioativa decai são completamente imprevisíveis e podem ser facilmente detectados e alimentados em um computador, evitando quaisquer mecanismos de buffer no sistema operacional.

O serviço HotBits do Fourmilab na Suíça é um excelente exemplo de um gerador de números aleatórios que usa essa técnica.

Outro fenômeno físico adequado é o ruído atmosférico, muito fácil de captar com um rádio normal. Esta é a abordagem usada pela RANDOM.ORG.

Você também pode usar o ruído de fundo de um escritório ou laboratório, mas deve estar atento aos padrões. A ventoinha do seu computador pode contribuir para o ruído de fundo porém, como a ventoinha é um dispositivo rotativo, é provável que o ruído que ela produza não seja tão aleatório quanto o ruído atmosférico.

Sem dúvida, a abordagem visualmente mais interessante é o gerador lavarand, que foi construído pela Silicon Graphics e usava fotos de lâmpadas de lava para gerar números aleatórios.

O projeto não está mais operacional, mas um de seus inventores continua o trabalho, sem as lâmpadas de lava, no site LavaRnd.

Ainda outra abordagem é o Java EntropyPool, que reúne bits aleatórios de uma variedade de fontes, incluindo HotBits e RANDOM.ORG, e também de acessos de página da web recebidos pelo próprio servidor do EntropyPool.

Independentemente de qual fenômeno físico é usado, o processo de geração de verdadeiros números aleatórios envolve a identificação de pequenas mudanças imprevisíveis nos dados. Por exemplo, HotBits usa pequenas variações no atraso entre ocorrências de decaimento radioativo, e RANDOM.ORG usa pequenas variações na amplitude do ruído atmosférico.

Quanto às características dos TRNGs, elas são bem diferentes dos PRNGs.

Em primeiro lugar, os TRNGs são geralmente ineficientes em comparação com os PRNGs, levando muito mais tempo para produzir números. Eles também são não determinísticos, o que significa que uma dada sequência de números não pode ser reproduzida, embora a mesma sequência possa, é claro, ocorrer várias vezes por acaso. Por fim, TRNGs não têm periodização, é possível gerar uma sequência infinita de números aleatórios.

Programas de geração de números aleatórios

A seguir apresento uma lista de programas, sites com serviços da internet e bibliotecas (pacotes de programação) ou material com estratégias em linguagens de programação para a geração de números aleatórios ou pseudo-aleatórios.

A primeira parte apresenta programa para testar sequências aleatórias, seguido de uma lista de softwares e serviços de internet para geração de números aleatórios, finalizando com tutoriais e exemplos de como gerar números aleatórios em linguagens de programação como C, PHP, Python, Java, Javascript, dentre outras.


Testes para números aleatórios

Testando sequências de bytes pseudo-aleatórias

Você pode usar o programa ENT (A Pseudorandom Number Sequence Test Program) para aplicar testes a sequências de bytes e relata o quão aleatório eles parecem ser.

Ao executá-lo em dados gerados por um gerador de sequência pseudo-aleatória de alta qualidade, você verá que ele gera dados que são indistinguíveis de uma sequência de bytes escolhidos aleatoriamente. Indistinguível, mas não genuinamente aleatório.

Geradores de números aleatórios

Recursos de softwares e serviços para geração de sequências e números aleatórios:

Random.org

RANDOM.ORG oferece verdadeiros números aleatórios para qualquer pessoa na Internet. A aleatoriedade vem do ruído atmosférico, que para muitos propósitos é melhor do que os algoritmos de números pseudo-aleatórios normalmente usados em programas de computador. As pessoas usam RANDOM.ORG para realizar sorteios, loterias e sorteios, para conduzir jogos online, para aplicações científicas e para arte e música. O serviço existe desde 1998 e foi construído pelo Dr. Mads Haahr da Escola de Ciência da Computação e Estatística do Trinity College, Dublin, na Irlanda. Hoje, RANDOM.ORG é operado pela Randomness and Integrity Services Ltd.

Serviços gratuitos

O site oferece uma variedade de serviços gratuitos separados por categorias:

Jogos e Loterias
  • O Quick Pick da loteria é talvez o mais popular da Internet, com mais de 280 loterias
  • Keno Quick Pick para o jogo popular jogado em muitos países
  • Coin Flipper lhe dará cara ou coroa em muitas moedas
  • Dice Roller faz exatamente o que diz: lança dados
  • Jogando Card Shuffler vai tirar cartas de vários baralhos embaralhados
  • Birdie Fund Generator criará buracos para pássaros em campos de golfe
Números
  • O gerador de inteiros cria números aleatórios em intervalos configuráveis
  • O Gerador de Sequência irá randomizar uma sequência inteira de sua escolha
  • Gerador de conjuntos inteiros faz conjuntos de inteiros não repetidos
  • O Gaussian Generator cria números aleatórios para se ajustar a uma distribuição normal
  • O Gerador de Fração Decimal cria números na faixa [0,1] com casas decimais configuráveis
  • Bytes aleatórios brutos são úteis para muitos propósitos criptográficos
Listas, strings e mapas
  • List Randomizer irá randomizar uma lista de tudo o que você tem (nomes, números de telefone, etc.)
  • String Generator cria strings alfanuméricas aleatórias
  • O Gerador de senhas cria senhas seguras para o seu Wi-Fi ou conta extra do Gmail
  • Clock Time Generator escolherá horários aleatórios do dia
  • O Calendar Date Generator escolherá dias aleatórios ao longo de quase três milênios e meio
  • O Gerador de Coordenadas Geográficas escolherá um local aleatório na superfície do nosso planeta
  • Bitmaps em preto e branco
  • O Gerador de código de cores hexadecimal escolherá os códigos de cores, por exemplo, para usar como cores da web
  • Arquivos pré-gerados contêm grandes quantidades de bits aleatórios para download
  • Pure White Audio Noise para composição ou apenas para testar seu equipamento de áudio
  • Escalas de jazz para praticar improvisação para estudantes de guitarra de jazz
  • A prosa curta gerada aleatoriamente de Samuel Beckett
  • Randomizer de sequência de proteínas de DNA (na Bio-Web)

O RANDOM.ORG ainda possui widgets para sites e API para o desenvolvimento de aplicações que necessitam de geração de números verdadeiramente aleatórios como jogos.

HotBits

HotBits é um recurso da Internet que traz números aleatórios genuínos, gerados por um processo fundamentalmente governado pela incerteza inerente às leis da mecânica quântica da natureza, diretamente para o seu computador em uma variedade de formas.

Os HotBits são gerados sincronizando pares sucessivos de decaimentos radioativos detectados por um tubo Geiger-Müller conectado a um computador.

Você solicita sua porção de HotBits preenchendo um formulário de solicitação especificando quantos bytes aleatórios você deseja e em qual formato deseja que eles sejam entregues. Sua solicitação é retransmitida para o servidor HotBits, que envia os bytes aleatórios de volta para você pela web.

Como o hardware de geração de HotBits produz dados a uma taxa modesta (cerca de 100 bytes por segundo), as solicitações são preenchidas a partir de um “inventário” de HotBits pré-construídos.

Uma vez que os bytes aleatórios são entregues a você, eles são imediatamente descartados - os mesmos dados nunca serão enviados a qualquer outro usuário e nenhum registro é mantido dos dados neste ou em qualquer outro site - Claro, se você estiver usando os dados aleatórios para criptografia ou outros aplicativos relacionados à segurança, não pode ter certeza de o serviço não está guardando uma cópia. Eles alegam que não.

Uma alternativa para baixar HotBits para uso posterior é fornecida pelo pacote randomX para Java. Um programa desenvolvido com randomX pode selecionar a partir de uma variedade de geradores de sequência pseudo-aleatória ou dados aleatórios genuínos de HotBits, obtidos sob demanda na Internet.


Lista de tutoriais para programar a geração de números aleatórios

Tutorial para linguagem C

Tutorial para geração de números aleatórios (randômicos) em C é um artigo que demonstra como gerar números randomicos usando a linguagem C e a função rand. Este artigo pode ser usado como base para geração também em C++.