Foi utilizado o Método da Congruência para a geração de números aleatórios de uma distribuição uniforme. Esta função será utilizada para a geração de números aleatórios dos métodos seguintes.
rand0 <- function(n){
x <- vector(mode="numeric", length=(n+1))
x[1] <- as.integer(Sys.time()) * runif(1)
m <- 2147483647
for(i in 2:length(x)){x[i] <- (99991*x[i-1] + 101)%%(m)}
return(round(x[-1]/m, 6))
}
Para verificarmos a validade da função, geramos 1 milhão de números aleatórios e aplicamos o test o Chi Quadrado. Fizemos o mesmo testo com 1 milhão de números ateatórios gerados pela função ‘runif()’ do ‘R’.
d_unif <- rand0(1000000)
d_unif.h <- hist(d_unif)
chisq.test(d_unif.h$counts)
#>
#> Chi-squared test for given probabilities
#>
#> data: d_unif.h$counts
#> X-squared = 21.679, df = 19, p-value = 0.3005
r_unif <- runif(1000000)
r_unif.h <- hist(r_unif)
chisq.test(r_unif.h$counts)
#>
#> Chi-squared test for given probabilities
#>
#> data: r_unif.h$counts
#> X-squared = 22.247, df = 19, p-value = 0.2721
Podemos observar que o ‘p-value’ encontrado em ambos os testes são muito próximos.
Através dos histogramas observamos visualmente que estas distribuições se assemelham.
A aplicação se refere à função 3 \[f(x) = \frac{7-7x^{5/2}}{5}, 0\leq x < 1\].
Verificando se a função densidade de probabilidade integra 1.
fx <- function(x){
return( (7 - 7 * x^(5/2) ) / 5 )
}
integrate(fx, 0, 1)
#> 1 with absolute error < 1e-08
Fx <- function(x){
f <- ( 7 * x - 2 * x^(7/2) ) / 5
return(f)
}
rgen1 <- function(n){
Fx <- function(x){
f <- ( 7 * x - 2 * x^(7/2) ) / 5
return(f)
}
aux <- seq(0, 1, l=50)
Fx1 <- approxfun(Fx(aux), aux)
y <- rand0(n)
return(Fx1(y))
}
x1 <- rgen1(100000)
rgen2 <- function(n){
fx <- function(x){
return( (7 - 7 * x^(5/2) ) / 5 )
}
gx <- function(x){
return(1)
}
x <- vector(mode="numeric", length=n)
i <- 1
while(i<=n){
y <- rand0(1)
u <- rand0(1)
w <- fx(y)/(1.4*gx(y))
if( u < w ){
x[i] <- y
i <- i + 1
}
}
return(x)
}
x1 <- rgen2(100000)
2º Trabalho proposto na página https://gitlab.c3sl.ufpr.br/walmes/ce089↩