Introducción
Las pruebas de validación de números pseudoaleatorios permiten evaluar
si una secuencia generada cumple con las propiedades estadísticas
esperadas de la aleatoriedad. La prueba de Kolmogorov-Smirnov verifica
la uniformidad al comparar la distribución acumulada de los datos con la
distribución teórica. La prueba de rachas (Runs Test) analiza la
independencia al medir la secuencia de valores altos y bajos respecto a
la media. Finalmente, la prueba de Póker examina patrones de dígitos en
grupos, similar a jugadas de cartas, para detectar desviaciones de la
aleatoriedad. Estas pruebas son esenciales en simulación, criptografía y
modelado estadístico.
En R, se aplica con la función ks.test().
Generando 50 números Pseudoaleatorios por el método secuencial mixto.
a <- 16853
c <- 2056
m <- 236
X_n <- 42 # 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.974576271 0.245762712 0.550847458 0.144067797 0.686440678 0.296610169
## [7] 0.483050847 0.567796610 0.788135593 0.161016949 0.330508475 0.771186441
## [13] 0.516949153 0.855932203 0.737288136 0.228813559 0.906779661 0.669491525
## [19] 0.652542373 0.008474576 0.533898305 0.500000000 0.211864407 0.262711864
## [25] 0.194915254 0.618644068 0.720338983 0.584745763 0.432203390 0.635593220
## [31] 0.364406780 0.059322034 0.466101695 0.923728814 0.313559322 0.127118644
## [37] 0.042372881 0.822033898 0.449152542 0.279661017 0.838983051 0.093220339
## [43] 0.754237288 0.872881356 0.381355932 0.703389831 0.940677966 0.957627119
## [49] 0.601694915 0.076271186
# Probando si los U_i provienen de una uniforme [0,1]
test_ks <- ks.test(random.number,"punif",0,1)
test_ks
##
## Exact one-sample Kolmogorov-Smirnov test
##
## data: random.number
## D = 0.052203, p-value = 0.9981
## 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]"
La prueba de Kolmogorov-Smirnov aplicada a los 50 números pseudoaleatorios generados muestra un valor p alto (0.9981), lo que indica que no se rechaza la hipótesis de uniformidad. Esto significa que los números se comportan como provenientes de una distribución uniforme [0,1]. Por lo tanto, el generador secuencial mixto cumple adecuadamente con la validación de uniformidad en este caso.
library(tseries)
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
diff(random.number) # halla la diferencia entre un valor y el otro en un vector
## [1] -0.72881356 0.30508475 -0.40677966 0.54237288 -0.38983051 0.18644068
## [7] 0.08474576 0.22033898 -0.62711864 0.16949153 0.44067797 -0.25423729
## [13] 0.33898305 -0.11864407 -0.50847458 0.67796610 -0.23728814 -0.01694915
## [19] -0.64406780 0.52542373 -0.03389831 -0.28813559 0.05084746 -0.06779661
## [25] 0.42372881 0.10169492 -0.13559322 -0.15254237 0.20338983 -0.27118644
## [31] -0.30508475 0.40677966 0.45762712 -0.61016949 -0.18644068 -0.08474576
## [37] 0.77966102 -0.37288136 -0.16949153 0.55932203 -0.74576271 0.66101695
## [43] 0.11864407 -0.49152542 0.32203390 0.23728814 0.01694915 -0.35593220
## [49] -0.52542373
S<-ifelse(diff(random.number) > 0, 1, 0) # seuencia de ceros y unos
S
## [1] 0 1 0 1 0 1 1 1 0 1 1 0 1 0 0 1 0 0 0 1 0 0 1 0 1 1 0 0 1 0 0 1 1 0 0 0 1 0
## [39] 0 1 0 1 1 0 1 1 1 0 0
runs.test(as.factor(S))
##
## Runs Test
##
## data: as.factor(S)
## Standard Normal = 1.6208, p-value = 0.1051
## 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] 31
num_corridas <-sum(diff(random.number) != 0) + 1
num_corridas
## [1] 50
La aplicación de la prueba de rachas (Runs Test) permitió comprobar la independencia de los números pseudoaleatorios generados. El resultado muestra que la cantidad de corridas observadas es consistente con la esperada en una secuencia aleatoria. Por lo tanto, no se evidencia dependencia entre los valores, validando que los números se comportan como independientes.
Los números pseudoaleatorios \(u_i\) se agrupan en combinaciones de varios dígitos decimales (típicamente grupos de 5 decimales). Los grupos se clasifican de manera similar a las manos en el juego de póker:
En R se aplica con la función poker.test()
del paquete
randtoolbox.
library(randtoolbox)
## Cargando paquete requerido: rngWELL
## This is randtoolbox. For an overview, type 'help("randtoolbox")'.
poker.test(random.number, nbcard = 5)
##
## Poker test
##
## chisq stat = 2.3, df = 4, p-value = 0.68
##
## (sample size : 50)
##
## observed number 0 1 7 2 0
## expected number 0.016 0.96 4.8 3.8 0.38
La aplicación de la prueba de Póker a los números pseudoaleatorios generados permitió contrastar la frecuencia observada de los distintos patrones de dígitos con las probabilidades teóricas esperadas. El resultado muestra que no existen desviaciones significativas respecto a la distribución teórica, lo cual valida que los números cumplen adecuadamente con la propiedad de aleatoriedad en cuanto a la formación de combinaciones similares a manos de póker.