D.2 Capítulo 2 Generación de números pseudoaleatorios

D.2.1 Ejercicio 2.1

Enunciado 2.1:

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\]

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: 0x0000026b5b0aa5b8>
## <environment: namespace:simres>

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