2.4 Ejercicios

Ejercicio 2.1 (Método de los cuadrados medios)

Uno de los primeros generadores utilizados fue el denominado método de los cuadrados medios propuesto por Von Neumann (1946). Con este procedimiento se generan números pseudoaleatorios de 4 dígitos de la siguiente forma:

  1. Se escoge un número de cuatro dígitos \(x_0\) (semilla).

  2. Se eleva al cuadrado (\(x_0^2\)) y se toman los cuatro dígitos centrales (\(x_1\)).

  3. Se genera el número pseudo-aleatorio como \[u_1=\frac{x_1}{10^{4}}.\]

  4. Volver al paso ii y repetir el proceso.

Para obtener los \(k\) (número par) dígitos centrales de \(x_{i}^2\) se puede utilizar que: \[x_{i+1}=\left\lfloor \left( x_{i}^2-\left\lfloor \dfrac{x_{i}^2}{10^{(2k-\frac{k}2)}}\right\rfloor 10^{(2k-\frac{k}2)}\right) /10^{\frac{k}2}\right\rfloor\]

Estudiar las características de este generador a partir de una secuencia de 500 valores. Emplear únicamente métodos gráficos.

Este algoritmo está implementado en la función simres::rvng() (ver también simres::rng(); fichero rng.R):

simres::rvng
## function(n, seed = as.numeric(Sys.time()), k = 4) {
##   seed <- seed %% 10^k
##   aux <- 10^(2*k-k/2)
##   aux2 <- 10^(k/2)
##   u <- numeric(n)
##   for(i in 1:n) {
##     z <- seed^2
##     seed <- trunc((z - trunc(z/aux)*aux)/aux2)
##     u[i] <- seed/10^k
##   }
##   # Almacenar semilla y parámetros
##   assign(".rng", list(seed = seed, type = "vm", parameters = list(k = k)),
##       envir = globalenv())
##   # .rng <<- list(seed = seed, type = "vm", parameters = list(k = k))
##   # Para continuar con semilla y parámetros:
##   #   with(.rng, rvng(n, seed, parameters$k))
##   # Devolver valores
##   return(u)
## }
## <bytecode: 0x0000023985e51430>
## <environment: namespace:simres>

Ejercicio 2.2

Considerando el generador congruencial multiplicativo de parámetros \(a=7^{5}=16807\), \(c=0\) y \(m=2^{31}-1\) (minimal standar de Park y Miller, 1988). ¿Se observan los mismos problemas que con el algoritmo RANDU al considerar las tripletas \((x_{k},x_{k+1},x_{k+2})\)?