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:
Se escoge un número de cuatro dígitos \(x_0\) (semilla).
Se eleva al cuadrado (\(x_0^2\)) y se toman los cuatro dígitos centrales (\(x_1\)).
Se genera el número pseudo-aleatorio como \[u_1=\frac{x_1}{10^{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):
::rvng simres
## 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.