Introdución
Las pruebas de validación de números pseudoaleatorios permiten verificar
si una secuencia generada cumple con las propiedades estadísticas
necesarias para considerarse aleatoria. La prueba de Kolmogorov-Smirnov
evalúa la uniformidad de los números al comparar la distribución
observada con la teórica. La prueba de rachas (Run Test) analiza la
independencia, verificando la secuencia de valores altos y bajos en
relación con la media. Finalmente, la prueba Póker agrupa los números
como si fueran cartas de una mano de póker, midiendo la frecuencia de
combinaciones y contrastándola con la esperada en una distribución
uniforme. Estas pruebas en conjunto aseguran la calidad y confiabilidad
de los números generados.
La prueba de Kolmogorov-Smirnov (K-S) es un método no paramétrico que compara la distribución acumulada de una muestra con una distribución teórica (por ejemplo, uniforme o normal), o bien, compara dos muestras entre sí. En el caso de validación de números pseudoaleatorios, se utiliza para verificar si los datos siguen una distribución uniforme en el intervalo [0,1].
Generando 50 números pseudoaleatorios por el metodo secuencial mixto.
a <- 58742
c <- 2000
m <- 100
X_n <- 39 # 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.38 0.96 0.32 0.44 0.48 0.16 0.72 0.24 0.08 0.36 0.12 0.04 0.68 0.56 0.52
## [16] 0.84 0.28 0.76 0.92 0.64 0.88 0.96 0.32 0.44 0.48 0.16 0.72 0.24 0.08 0.36
## [31] 0.12 0.04 0.68 0.56 0.52 0.84 0.28 0.76 0.92 0.64 0.88 0.96 0.32 0.44 0.48
## [46] 0.16 0.72 0.24 0.08 0.36
# 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.08, p-value = 0.9062
## 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 la serie generada permite verificar si los números pseudoaleatorios presentan un comportamiento similar a una distribución uniforme en el intervalo [0,1]. En este caso, el valor p obtenido indica si se rechaza o no la hipótesis nula de uniformidad. Si el p-value es mayor a 0.05, los resultados sugieren que la secuencia puede considerarse aleatoria y adecuada para simulaciones. Por el contrario, un valor bajo señalaría posibles sesgos en el generador utilizado. En general, esta prueba resulta una herramienta útil para validar la calidad estadística de los números generados.
library(tseries)
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
diff(random.number)
## [1] 0.58 -0.64 0.12 0.04 -0.32 0.56 -0.48 -0.16 0.28 -0.24 -0.08 0.64
## [13] -0.12 -0.04 0.32 -0.56 0.48 0.16 -0.28 0.24 0.08 -0.64 0.12 0.04
## [25] -0.32 0.56 -0.48 -0.16 0.28 -0.24 -0.08 0.64 -0.12 -0.04 0.32 -0.56
## [37] 0.48 0.16 -0.28 0.24 0.08 -0.64 0.12 0.04 -0.32 0.56 -0.48 -0.16
## [49] 0.28
S<-ifelse(diff(random.number) > 0, 1, 0) # seuencia de ceros y unos
S
## [1] 1 0 1 1 0 1 0 0 1 0 0 1 0 0 1 0 1 1 0 1 1 0 1 1 0 1 0 0 1 0 0 1 0 0 1 0 1 1
## [39] 0 1 1 0 1 1 0 1 0 0 1
runs.test(as.factor(S))
##
## Runs Test
##
## data: as.factor(S)
## Standard Normal = 2.7471, p-value = 0.006012
## 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] 35
num_corridas <-
sum(diff(random.number) !=0) + 1
num_corridas
## [1] 50
La prueba de rachas aplicada a la secuencia generada permite evaluar la independencia de los números pseudoaleatorios. Al analizar la cantidad de rachas obtenidas frente a lo esperado, se puede detectar si existen patrones o dependencias en los datos. Si el valor p de la prueba es mayor a 0.05, no se rechaza la hipótesis nula, lo que sugiere independencia en la secuencia. En caso contrario, un p bajo indicaría correlaciones no deseadas. Esta prueba complementa la verificación de uniformidad, garantizando mayor confiabilidad en el generador pseudoaleatorio.
a prueba Póker es una técnica de validación de números pseudoaleatorios inspirada en el juego de cartas. Consiste en agrupar los números generados en bloques de dígitos y clasificar los patrones que aparecen (por ejemplo: pares, tríos, full, todos diferentes, etc.). Luego, se compara la frecuencia observada de cada patrón con la frecuencia esperada bajo la hipótesis de aleatoriedad. Si las diferencias son pequeñas, se acepta que los números cumplen con la propiedad de aleatoriedad; si no, se concluye que la secuencia presenta patrones no deseados. Los números pseudoaleatorios ui se agrupan en combinaciones de varios dígitos decimales (típicamente grupos de 5 decimales). Los grupos de dígitos 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")'.
Aplicar prueba de Póker a los números generados
poker.test(random.number,nbcard=5)
##
## Poker test
##
## chisq stat = 291, df = 4, p-value = 8.4e-62
##
## (sample size : 50)
##
## observed number 2 7 1 0 0
## expected number 0.016 0.96 4.8 3.8 0.38
La prueba de Póker aplicada a la secuencia generada permite evaluar la presencia de patrones en los dígitos de los números pseudoaleatorios. Al comparar las frecuencias observadas de cada tipo de combinación con las frecuencias esperadas bajo la hipótesis de aleatoriedad, se determina si la secuencia cumple con las propiedades estadísticas deseadas. Si el valor p obtenido es mayor a 0.05, no se rechaza la hipótesis nula y se concluye que los números muestran un comportamiento aleatorio aceptable. En caso contrario, un valor bajo revelaría sesgos o repeticiones no deseadas en los dígitos. De esta forma, la prueba complementa la verificación de uniformidad e independencia.