Introduccion
Las pruebas de validación de números pseudoaleatorios permiten verificar si una secuencia generada presenta propiedades similares a la de un conjunto verdaderamente aleatorio. Entre ellas, la prueba de Kolmogorov-Smirnov evalúa la uniformidad comparando la distribución empírica con la teórica. La Run Test analiza la independencia midiendo la frecuencia y longitud de las rachas de números mayores o menores a la media. Finalmente, la prueba Póker estudia la secuencia en bloques, verificando la ocurrencia de patrones similares a las manos de póker, lo que permite detectar irregularidades en la distribución y dependencia de los números.
1.Prueba de Kolomogorov Smirnoff
La prueba de Kolmogorov-Smirnov (K-S) se utiliza para comparar una muestra de datos con una distribución teórica (por ejemplo, uniforme o normal) y determinar si existe diferencia significativa entre ambas. La prueba mide la máxima distancia entre la función de distribución acumulada empírica de los datos y la función de distribución acumulada teórica. Si la diferencia es grande, se rechaza la hipótesis de que los datos provienen de esa distribución.
En RStudio, se usa la función ks.test(). Ejemplo para verificar si una muestra proviene de una distribución uniforme:
Generando 50 numeron pseudoaleatorios por el metodo secuencial mixto.
a <- 2098261
c <- 7000
m <- 500
X_n <- 70 # semilla
random.number<-numeric(50) # vector numérico de longitud 50
for (i in 1:50)
{X_n<-(a*X_n+c)%%m
random.number[i]<-X_n/m # números en el intervalo [0,1]
}
random.number
## [1] 0.54 0.94 0.34 0.74 0.14 0.54 0.94 0.34 0.74 0.14 0.54 0.94 0.34 0.74 0.14
## [16] 0.54 0.94 0.34 0.74 0.14 0.54 0.94 0.34 0.74 0.14 0.54 0.94 0.34 0.74 0.14
## [31] 0.54 0.94 0.34 0.74 0.14 0.54 0.94 0.34 0.74 0.14 0.54 0.94 0.34 0.74 0.14
## [46] 0.54 0.94 0.34 0.74 0.14
# Probando si los U_i provienen de una uniforme [0,1]
test_ks <- ks.test(random.number,"punif",0,1)
## Warning in ks.test.default(random.number, "punif", 0, 1): ties should not be
## present for the one-sample Kolmogorov-Smirnov test
test_ks
##
## Asymptotic one-sample Kolmogorov-Smirnov test
##
## data: random.number
## D = 0.14, p-value = 0.281
## alternative hypothesis: two-sided
ifelse(test_ks$p.value < 0.05, " Los u_i no siguen una distribución uniforme","Los u_i siguen la distribución uniforme [0,1]") #
## [1] "Los u_i siguen la distribución uniforme [0,1]"
En la prueba realizada con los 50 números generados por el método congruencial mixto, la aplicación de Kolmogorov-Smirnov permitió contrastar si los valores simulados siguen una distribución uniforme en [ 0 , 1] [0,1]. El resultado muestra un valor-p que, al ser comparado con el nivel de significancia (5%), indica si se acepta o rechaza la hipótesis de uniformidad. En este caso, si el valor-p es mayor a 0.05, se concluye que los números generados no presentan diferencias significativas con una distribución uniforme, lo que valida parcialmente el generador. Sin embargo, es recomendable complementar con otras pruebas (Run Test, Póker) para evaluar independencia y patrones ocultos en la secuencia.
La prueba Run Test es una técnica no paramétrica utilizada para comprobar la independencia de una secuencia de números pseudoaleatorios. Se basa en contar las rachas (series consecutivas) de valores mayores y menores que la media o la mediana. Si la cantidad y longitud de estas rachas difiere mucho de lo esperado en una secuencia aleatoria, se rechaza la hipótesis de independencia. En otras palabras, la prueba detecta patrones repetitivos o tendencias que indicarían que los números no son completamente aleatorios.
library(tseries)
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
diff(random.number)
## [1] 0.4 -0.6 0.4 -0.6 0.4 0.4 -0.6 0.4 -0.6 0.4 0.4 -0.6 0.4 -0.6 0.4
## [16] 0.4 -0.6 0.4 -0.6 0.4 0.4 -0.6 0.4 -0.6 0.4 0.4 -0.6 0.4 -0.6 0.4
## [31] 0.4 -0.6 0.4 -0.6 0.4 0.4 -0.6 0.4 -0.6 0.4 0.4 -0.6 0.4 -0.6 0.4
## [46] 0.4 -0.6 0.4 -0.6
S<-ifelse(diff(random.number) > 0, 1, 0) # seuencia de ceros y unos
S
## [1] 1 0 1 0 1 1 0 1 0 1 1 0 1 0 1 1 0 1 0 1 1 0 1 0 1 1 0 1 0 1 1 0 1 0 1 1 0 1
## [39] 0 1 1 0 1 0 1 1 0 1 0
runs.test(as.factor(S))
##
## Runs Test
##
## data: as.factor(S)
## Standard Normal = 4.5833, p-value = 4.578e-06
## alternative hypothesis: two.sided
# devuelve 1 si el número es mayor que el anterior y 0 en caso contrario.
# Detectar cambios
cambios <- abs(diff(S))
# Contar las corridas
corridas <- sum(cambios) + 1
corridas
## [1] 40
La prueba Run Test aplicada sobre la secuencia generada evalúa si los números se comportan como independientes entre sí. El resultado entrega un valor-p que, al compararse con un nivel de significancia (ej. 0.05), indica si se rechaza o no la hipótesis de independencia. Si el valor-p es alto, no hay evidencia de patrones o tendencias y se concluye que la secuencia presenta independencia. Si es bajo, significa que los números muestran cierta dependencia y no son completamente aleatorios. En este caso, el conteo de corridas complementa el análisis al mostrar cuántas rachas efectivas se formaron en la secuencia.