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

Trabalharemos com uma classe chamada LCG (Linear Congruential Generator) dentro de um módulo chamado PRNG (Pseudorandom Number Generator).



Antes de resolver a equação precisamos ter a certeza de que os valores utilizados são válidos. O primeiro passo é criar testes para a validação de cada variável. Vamos validar inicialmente as regras isoladas de cada uma (inteiro, maior que zero, etc.).


Iremos testar para cada variável um conjunto de valores inválidos que deverão gerar erros e um conjunto de valores válidos que não deverão gerar erros. Os valores de exemplo serão:


$\color{highlight}m$ (modulus) $\color{gray}= ℤ > 0$

- valores inválidos: [-2, 0, 1.5]
- valor válido: 1

$\color{highlight}a$ (multiplier) $\color{gray}= ℤ > 0$

- valores inválidos: [-2, 0, 1.5]
- valor válido: 1

$\color{highlight}c$ (increment) $\color{gray}= ℤ \ge 0$

- valores inválidos: [-2, 1.5]
- valores válidos: [0, 1]

$\color{highlight}X_{0}$ (seed) $\color{gray}= ℤ \ge 0$

- valores inválidos: [-2, 1.5]
- valores válidos: [0, 1]


Com isso em mãos, vamos escrever o teste:


O teste não está passando, pois não criamos código nenhum, apenas descrevemos o comportamento que esperamos. Vamos criar a nossa classe LCG e dentro dela criar os métodos que irão gerar erros ao receber valores inválidos e retornarão true ao receber valores válidos. Como descrito nos testes, os nossos métodos serão valid_modulus?, valid_multiplier?, valid_increment? e valid_seed?:


Pronto, testes passando! Agora já temos métodos para validar cada um dos valores isoladamente.


Os valores de multiplier, increment e seed precisam ser menores que o valor de modulus, então precisamos garantir que os valores juntos sejam válidos também. Vamos criar testes para um método que gere erro quando ocorrer alguma destas situações inválidas e retorne true quando todos os valores forem válidos:


Teste feito e quebrando, vamos criar o método valid_relations? descrito no teste:


Pronto. Agora temos métodos para validar cada variável e um método para validar se todas as variáveis podem trabalhar juntas. Para facilitar a utilização da classe, vamos criar um método que faça tudo isso de uma vez. O nosso teste irá conferir um caso de variável inválida, um caso de variáveis que não podem trabalhar juntas e um caso em que todos os valores são válidos:


Vamos criar o método valid_variables? para o teste passar. Ele chamará todos os demais métodos de validação que criamos até aqui:


Pronto, agora já temos tudo o que precisamos para poder definir os valores das variáveis garantindo que eles serão válidos.