Por que computadores não podem gerar números aleatórios?

Porque computadores não são nada além de calculadoras, e se são cálculos não são verdadeiramente aleatórios.

O computador se utiliza de diversos procedimentos estatísticos que aparentam aleatoriedade, mas são apenas contas. Por isso dizemos que o computador gera números pseudoaleatórios.

 

Existem iniciativas verdadeiramente aleatórias, por exemplo o site True Random Number Service oferece um serviço onde números aleatórios são produzidos a partir da microfonação de ruído atmosférico.

 

Geração de números aleatórios é um assunto amplamente estudado e que tem aplicações em várias áreas. Números aleatórios usados em computadores comuns não são verdadeiramente "aleatórios" sendo por isso chamados de números pseudo-aleatórios. Existem máquinas especialmente construídas para a geração de números aleatórios.

 

Existem vários algoritmos para geração de números pseudo-aleatórios em computadores. Os algoritmos são chamados de geradores de números aleatórios.

 

Um dos mais conhecidos geradores de números aleatórios é baseado no chamado método das congruências lineares. Dado um número inicial X0, conhecido como semente, o próximo número da sequência é dado por

 

X1 = (aX0 +b) % m.

 

Em geral, o número Xi+1 é obtido a partir do número Xi pela fórmula

 

Xi+1 = (aXi +b) % m,

 

onde a, b e m são números criteriosamente escolhidos. O operador % indica resto da divisão. Os números assim gerados estão entre 0 e m-1.

 

Por exemplo, para a=7, b=1, m = 13 e X0 = 3, a sequência de números gerada é

 

9 12 7 11 0 1 8 5 10 6 4 3 9 . . .   

 

Uma forma de usar esse gerador de números aleatórios para gerar números entre 1 e k, é usar a fórmula

 

Yi = 1 + (Xi % k).

 

Para a sequência do exemplo mostrado acima, os números gerados entre 1 e k=5 seriam

 

5 3 3 2 1 2 4 1 1 2 5 4 5 . . .   

 

Um pouco mais sobre números aleatórios

 

Para os mais curiosos, segue uma pequena explicação bem simplificada sobre o fenômeno de "os números estão repetindo", que ocorre ao usarmos algum gerador de números aleatórios.

 

Um gerador de número aleatórios é uma função que devolve os números de uma sequência, um número a cada chamada da função. Suponha que, através de várias chamadas da função, a sequência

 

X0 X1 X2 X3 X4 . . .

 

é obtida e suponha que o gerador usa o método das congruências lineares através da expressão

 

Xi+1 = (aXi +b) % m,

 

onde a, b e m são constantes inteiras.

 

Considere, para simplificar muito as coisas, um gerador de números aleatórios que devolve números inteiros entre 0 e 6. Suponha que a sequência devolvida por esse tal gerador é

 

1 6 0 5 3 3 4 2 1 2 1 6 0 5 3 3 4 2 1 2 1 6 . . .

 

Com isto queremos dizer que o primeiro valor obtido pelo gerador é o número 1, o segundo valor obtido é o número 6, e assim por diante. Reparem que a sequência começa a se repetir a partir de um certo ponto; notem

 

1 6 . . . 1 6 . . .

 

Há quem chame esse tipo de sequência de cíclica. A posição na sequência a partir da qual o gerador começa a devolver os números é determinada por um valor, a chamada semente do gerador, que pode ou não ser fornecida ao gerador para que ele faça o seu serviço. Por exemplo, digamos que seja fornecido ao nosso gerador imaginário o número 1234 como semente, a partir daí ele pode, digamos, devolver os números abaixo, na ordem em que aparecem,

 

3 3 4 2 1 2 1 6 0 5 3 3 4 2 1 2 1 6 0 5 3 3 . . .

 

Já, se fornecermos a semente 4321, o gerador talvez passe a devolver os números

 

4 2 1 2 1 6 0 5 3 3 4 2 1 2 1 6 1 6 0 5 3 3 4 2

 

Resumindo, a semente só determina o ponto exato do início da sequência cíclica a partir do qual os números são devolvidos pelo gerador.

 

De volta ao EP1, o comando

srand(time(NULL));

 

inicializa a semente do gerador com o valor do relógio do computador. Se usarmos o comando

 

srand(1234);

 

a semente do gerador é inicializada com 1234 e, cada vez que o programa é executado, a sequência devolvida pelo gerador será precisamente a mesma. Isso pode ser útil para achar erros no programa.

 

O gerador usado pelo Python é o Mersenne Twister, e não congruências lineares, porém as mesmas explicações acima se aplicam a ele também.

 

A única forma teoricamente garantida de gerar números perfeitamente aleatórios é com a utilização de computadores quânticos.

 

Isso por conta da própria natureza. Enquanto computadores clássicos utilizam algoritmos determinísticos para simular aleatoriedade, computadores quânticos são probabilísticos por natureza.

 

Uma das primeiras aplicações desta tecnologia é exatamente a geração de números aleatórios, que podem ser utilizados para criptografia segura, por exemplo.

 

Conheça mais sobre a computação quântica

 

Criptografia e criptografia quântica: o que é e como funciona

 

Criptografia Quântica, Explicada

 

O que é criptografia quântica? A única maneira de proteção contra computadores quânticos

 

Compreendendo a computação quântica por meio da mente de um viciado

 

 

O Avance Network é uma comunidade fácil de usar que fornece segurança de primeira e não requer muito conhecimento técnico. Com uma conta, você pode proteger sua comunicação e seus dispositivos. O Avance Network não mantém registros de seus dados; portanto, você pode ter certeza de que tudo o que sai do seu dispositivo chega ao outro lado sem inspeção.


Strong

5178 بلاگ پوسٹس

تبصرے