Introduccion
Las pruebas de validación de números pseudoaleatorios permiten evaluar si una secuencia generada cumple con las propiedades de aleatoriedad requeridas en aplicaciones estadísticas y criptográficas. Entre ellas se encuentra la prueba de Kolmogorov-Smirnov, que compara la distribución empírica de los datos con la teórica para verificar uniformidad. La prueba de rachas (Run test) analiza la secuencia de valores para detectar patrones de dependencia o repeticiones. Por su parte, la prueba de Póker agrupa números en bloques y verifica la frecuencia de combinaciones, similar al análisis de manos en el juego de póker. Estas pruebas ayudan a identificar si el generador produce secuencias realmente impredecibles y distribuidas de forma uniforme.
La prueba de Kolmogorov-Smirnov (K-S) es una prueba no paramétrica que compara la distribución de una muestra con una distribución teórica (por ejemplo, uniforme) o compara dos muestras entre sí. Evalúa la máxima diferencia entre las funciones de distribución acumulada (empírica y teórica) para verificar si los datos se ajustan a la distribución esperada.
En R, se utiliza con la función ks.test(). Por ejemplo, si tienes una muestra de números pseudoaleatorios x y quieres probar si siguen una distribución uniforme en el intervalo (0,1):
Generando 50 numeros Pseudoaleatorios por el metodo secuencial mixto.
a <- 2005
c <- 1562
m <- 9973
X_n <- 420 # 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.59460543 0.34051940 0.89802467 0.69607941 0.79584879 0.83345032
## [7] 0.22450617 0.29148701 0.58808784 0.27273639 0.99308132 0.28466861
## [13] 0.91717638 0.09525719 0.14729770 0.48851900 0.63722050 0.78371603
## [19] 0.50726963 0.23222701 0.77178382 0.58317457 0.42163842 0.54166249
## [25] 0.18991276 0.93171563 0.24646546 0.31986363 0.48320465 0.98195127
## [31] 0.96891607 0.83335005 0.02346335 0.20064173 0.44329690 0.96691066
## [37] 0.81249373 0.20655771 0.30482302 0.32678231 0.35515893 0.25027574
## [43] 0.95949062 0.93532538 0.48400682 0.59029379 0.69567833 0.99167753
## [49] 0.47006919 0.64534242
# 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.12991, p-value = 0.338
## 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]"
Evaluando los datos proporcionados y haciendo la prueba de validacion, especificamente la prueba de Kolmogorov-Smirnov podemos concluir que los Ui siguen una distribucion uniforme.
La prueba de rachas (Run test) es una técnica no paramétrica que se usa para verificar si una secuencia de números pseudoaleatorios es verdaderamente aleatoria. Se basa en contar las rachas (subsecuencias de valores consecutivos similares, ya sea mayores o menores a la media/mediana). Si el número de rachas es demasiado alto o demasiado bajo respecto al esperado, indica patrones o dependencia en los datos. En esencia, esta prueba evalúa la independencia de la secuencia y ayuda a detectar tendencias o agrupamientos que no deberían aparecer en números aleatorios.
library(tseries)
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
diff(random.number)
## [1] -0.25408603 0.55750526 -0.20194525 0.09976938 0.03760152 -0.60894415
## [7] 0.06698085 0.29660082 -0.31535145 0.72034493 -0.70841271 0.63250777
## [13] -0.82191918 0.05204051 0.34122130 0.14870149 0.14649554 -0.27644641
## [19] -0.27504262 0.53955680 -0.18860924 -0.16153615 0.12002406 -0.35174972
## [25] 0.74180287 -0.68525018 0.07339818 0.16334102 0.49874662 -0.01303520
## [31] -0.13556603 -0.80988669 0.17717838 0.24265517 0.52361376 -0.15441693
## [37] -0.60593603 0.09826532 0.02195929 0.02837662 -0.10488318 0.70921488
## [43] -0.02416525 -0.45131856 0.10628697 0.10538454 0.29599920 -0.52160834
## [49] 0.17527324
S<-ifelse(diff(random.number) > 0, 1, 0) # seuencia de ceros y unos
S
## [1] 0 1 0 1 1 0 1 1 0 1 0 1 0 1 1 1 1 0 0 1 0 0 1 0 1 0 1 1 1 0 0 0 1 1 1 0 0 1
## [39] 1 1 0 1 0 0 1 1 1 0 1
runs.test(as.factor(S))
##
## Runs Test
##
## data: as.factor(S)
## Standard Normal = 1.4744, p-value = 0.1404
## 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] 30
Con la prueba Runtest encontramos que el numero de corridas son 30
es un test estadístico usado para evaluar la aleatoriedad de una secuencia de números pseudoaleatorios. Consiste en agrupar los números en bloques (generalmente de 5 dígitos) y clasificarlos en patrones similares a las manos del póker (pares, tríos, full, etc.). Luego, se comparan las frecuencias observadas con las esperadas mediante una prueba de chi-cuadrado para determinar si la secuencia presenta o no un comportamiento aleatorio. Los grupos de dígitos se clasifican de manera similar a las manos en el juego de póker:
Ningún decimal se repite en el grupo (Ej: 0.12345). la probabilidad de este evento es: P(TD)=0.3024
Un decimal aparece dos veces y los demás son diferentes (Ej: 0.14345). P(1p)=0.5040
Dos decimales aparecen dos veces cada uno (Ej: 0.14224). P(2p)=0.1080
Un decimal aparece tres veces, y los otros dos son diferentes (Ej: 0.41443). P(T)=0.0720
Un dígito aparece tres veces y otro dígito dos veces (Ej: 0.32223). P(FH)=0.0090
Un dígito aparece cuatro veces (Ej: 0.55515). P(p)=0.0045
Todos los dígitos son iguales (Ej: 0.11111). P(Q)=0.0001
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 = 4.5, df = 4, p-value = 0.34
##
## (sample size : 50)
##
## observed number 0 2 6 1 1
## expected number 0.016 0.96 4.8 3.8 0.38