Mas, afinal, como é gerada a randomização pelo computador?

Mas, afinal, como é gerada a randomização pelo computador?

27 de setembro de 2017 1 Por Ramos de Souza Janones
Como vender Software - Seja desktop, web ou MobilePowered by Rock Convert
Powered by Rock Convert

Como é feita a randomização pelo computador? Qual algorítimo ou qual base matemática o computador usa para gerar esses números?

Muito se perguntam em fóruns de discussão:

  1. Como é feita a randomização pelo computador?
  2. Qual algorítimo ou qual base matemática o computador usa para gerar esses números?

Vamos tentar responder!

A única coisa realmente randômica são efeitos quânticos, como o decaimento radioativo (qual dos núcleos vai se partir agora?). E isso é meio complicado de se obter em computadores domésticos.

Curso de PHP ERP com NFe.

Vários desses algoritmos (em particular o rand() do C, que muitas linguagens usam) se baseiam em geradores pseudo-randômicos. Eles geram uma sequencia de números que parece aleatória para uma pessoa, mas que são totalmente previsíveis se partirem de uma seed conhecida. São, portanto, péssimos para segurança ou criptografia. Eles pegam uma seed (valor inicial dado, geralmente partindo de uma fonte externa, como a data/hora de início do processo) e aplicam transformações para gerar o próximo valor. A vantagem é que são rápidas. E o fato de serem previsíveis permite que você guarde a seed de um puzzle gerado como seu id, por exemplo, e não tenha que gastar espaço algum com o puzzle em si, basta gerar novamente pela mesma seed.

Por exemplo: (acabo de inventar esse algoritmo, não é bom)

static double seed; // uma seed entre 0 e 1
double random() {
   seed /= 1125899839733759;  // um número primo
   seed *= 18014398241046527; // outro
   seed -= (int)seed;         // normalizar
   return seed;
}

int main() {
    seed = 0.753;
    printf("%f\n", random()); // 0.048001
    printf("%f\n", random()); // 0.768009
    printf("%f\n", random()); // 0.288139
    printf("%f\n", random()); // 0.610224
    printf("%f\n", random()); // 0.763582
}

 

LEIA TAMBÉM:  C# - O que é Hashcode e qual sua finalidade?

(coliru)

Powered by Rock Convert

Um dos algoritmos mais usados para isso é o Mersenne Twister, que é capaz de gerar 219937-1 números antes de repetir a sequencia.

Para qualquer caso desses, é importante que se tome cuidado na escolha da seed. Se um atacante ganha conhecimento da seed usada por você, ele pode prever todos os movimentos do programa. Um exemplo desse tipo de ataque contra um site de poker online pode ser encontrado nesse artigo: How We Learned to Cheat at Online Poker: A Study in Software Security.

O ataque se inicia com o conhecimento de que a função Randomize() do Pascal é utilizada e de que ela usa como seed o número de milissegundos desde a meia noite. O problema é que posso chutar o tempo exato em que aconteceu a randomização no servidor (ou seja, a hora que o poker foi iniciado). Considerando que erre 1 minuto para mais ou para menos, são apenas 180.000 possíveis sequencias.

Um número extremamente pequeno para um computador, basta testar todas as sequencias possíveis e comparar qual gera as cartas que tenho em mãos. No momento que descobrir qual é a sequencia, é possível extrapolar e conhecer as cartas na mão de todos os jogadores. Conhecimento aprendido: Usar apenas o relógio como fonte de uma seed que deveria ser aleatória e oculta é uma péssima ideia.

Outros métodos se baseiam em fontes de entropia que possa ser obtida do hardware, como por exemplo análises de uso do teclado, movimentação do mouse, tráfego de pacotes na rede, etc. Tendo dados suficientes isso será tão próximo do aleatório quanto possível. No Linux você pode ler dessa fonte através dos pseudo-arquivos /dev/random ou /dev/urandom. Eles são uma boa fonte se você precisa de número randômicos reais e podem ser utilizados para inicializar a seed de um gerador pseudo-randômicos, se conveniente.

 » Programação 

Powered by Rock Convert
Siga os bons!
Últimos posts por Ramos de Souza Janones (exibir todos)
vote
Article Rating
LEIA TAMBÉM:  Como desenvolver aplicações AR/VR com Javascript e React