Geração de Números Aleatórios de Uma Distribuição Uniforme

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))
}

Comparação com a Função ‘runif()’

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.

Geração de Números Aleatórios Através do Método da Transformação Integral de Probabilidade

A aplicação se refere à função 3 \[f(x) = \frac{7-7x^{5/2}}{5}, 0\leq x < 1\].

Densidade

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

Gráfico da Função de Densidade

Função de Distribuição Acumulada \(F(x)\).


Fx <- function(x){
  f <- ( 7 * x - 2 * x^(7/2) ) / 5
  return(f)
}

Gráfico da Função de Densidade Acumulada

Função de Geração de Números Aleatórios (rgen1)


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))
}

Gráfico da Função de Densidade Acumulada


x1 <- rgen1(100000)

Função de Geração de Números Aleatórios (rgen2)


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)
}

Gráfico da Função de Densidade Acumulada


x1 <- rgen2(100000)


  1. 2º Trabalho proposto na página https://gitlab.c3sl.ufpr.br/walmes/ce089