E-Zine Exclusivo para o Whastapp

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

random-800x451 Mas, afinal, como é gerada a randomização pelo computador?
foto_ramos Mas, afinal, como é gerada a randomização pelo computador?

Ramos de Souza Janones

Janones, é um empreendedor brasileiro apaixonado por empreendedorismo e tecnologia. Ao longo dos anos trabalhando com o desenvolvimento de softwares desktop desde a linguagem Clipper, passando pelo Delphi e atualmente com Java.

Optou pela formação de Publicidade e Marketing por sua segunda empresa de tecnologia ter participado do "boom" da internet nos anos 90 e na procura de melhorar seus conhecimentos em negócios.

Em razão da principal formação e profundos conhecimentos em programação e banco de dados, é capaz de realizar o desenvolvimento de aplicativos web, desktop e mobile com maior criatividade e inovação que profissionais de desenvolvimento com uma formação única e mais especifica, dedicada somente ao desenvolvimento de softwares.

Com toda sua experiência com empresas de software, sua formação e paixão por negócios escreveu o livro "Marketing para Empresas e Profissionais de Software", publicado pela editora carioca Ciência Moderna em 2012. Além de outros livros sobre programação.
foto_ramos Mas, afinal, como é gerada a randomização pelo computador?

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)

 

(coliru)

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.

Top
%d blogueiros gostam disto: