$\definecolor{highlight}{RGB}{2, 154, 207}$$\definecolor{extralight}{RGB}{217, 35, 15}$

Na primeira parte deste artigo definimos os valores para as variáveis como $\color{highlight}m$ (modulus) $\color{gray}=$ $5$, $\color{highlight}a$ (multiplier) $\color{gray}=$ $2$, $\color{highlight}c$ (increment) $\color{gray}=$ $3$ e $\color{extralight}X_{0}$ (seed) $\color{gray}=$ $0$. Com tais valores, resolvendo 4 vezes a equação conseguimos os seguintes números pseudoaleatórios: [3, 4, 1, 0].


Vamos criar um teste que instancie a nossa classe com estes valores e que ao ser executado 4 vezes retorne exatamente os mesmos números que conseguimos fazendo o processo manualmente:


Teste quebrando, vamos criar o método generate que será responsável por gerar o número pseudaleatório. Neste método iremos associar os valores das variáveis às letras (a $=$ multiplier, etc.) para que o código fique parecido com a equação original, facilitando assim o entendimento. O valor de $\color{highlight}X_n$ será sempre o último valor calculado ou o seed ($X_0$) caso ele ainda não exista.


Pronto! O algorítimo está pronto para ser utilizado, já podemos gerar números aleatórios a partir dele.


1
2
3
4
5
6
7
8
9
10
11
12

Que tal testar ele funcionando na prática? Mude os valores, teste se realmente dá erro quando os valores são inválidos, se os números estão sendo gerados, etc.


Uma dica: Para termos números aleatórios a cada chamada, precisamos ter um seed sempre novo. Uma forma básica e simples de fazer isso seria configurar as variáveis considerando que o seed será um número entre 0 e 60 e ao invés de definir o seed manualmente, pegamos o segundo atual para instanciar a classe com Time.now.sec.

E é isso! Para os exemplos de utilização do algoritmo, criei uma versão em JavaScript do mesmo código. Tanto a versão em Ruby que contruímos juntos aqui quanto a em JavaScript estão disponíveis neste repositório do GitHub:
https://github.com/gbaptista/pseudorandom-number-generators


O LCG já foi (e em muitos casos ainda é) muito utilizado em diversas linguagens de programação. Fiz uma brincadeira de visualizar graficamente como os números são gerados de acordo com as variáveis que cada linguagem define, você pode conferir nesta publicação como ficou:
- Gerador congruente linear (LCG): Vizualizando e comparando diferentes escolhas de parâmetros