Você está na página 1de 2

Gerador Congruente Linear

O gerador congruente linear é um algoritmo que produz uma seqüência de números


pseudo-aleatórios calculados a partir de uma relação de recorrência modular. O método
representa um dos mais antigos e conhecidos algoritmos do geração de números de
pseudo-aleatórios.
O gerador é definido pela relação de recorrência:

Xn+1=(aXn+c) mod mXn+1=(aXn+c) mod m

onde XX é a seqüência de valores de pseudo-aleatório, e a,c<ma,c<m


Como o número de classes módulo mm é finito a sequência possui um período.
Claramente o período é no máximo mm e para algumas escolhas de a,ca,c e mm pode
ser muito menor do que isso. O gerador congruente misto terá um período
completo mm para todos os valores de X0X0 se e somente se:

 m e c c são relativamente primos,


 a-1 é divisível por todos os fatores primos de m,
 a - 1 é divisível por 4 se m é divisível por 4.

Esse fato é conhecido como Teorema de Hull-Dobell.

Implementação
Nas linhas abaixo implementamos um CGL. Usamos definição recursiva com
memorização dos valores já encontrados.

a=17
b=7
m=1024

RX <- local({
memo <- c( rep(NA, 100000))
f <- function(x) {
if(x == 0) return(9)
if(x < 0) return(NA)
if(x > length(memo))
stop("'x' grande demais")
if(!is.na(memo[x])) return(memo[x])
resp <- (a*f(x-1)+b)%% m
memo[x] <<- resp
resp
}
})

Análise
Abaixo apresentamos o histograma dos números pseudo-aleatórios gerado.

hist(sapply(1:10000,RX),breaks = seq(0, 1024, by = 128),col="blue")

Você também pode gostar