prueba de validacion

Introduccion

Las pruebas de validación de números pseudoaleatorios (PRNG) son esenciales para asegurar que las secuencias de números generadas por un algoritmo sean impredecibles, uniformes e independientes, lo que las hace adecuadas para aplicaciones como criptografía, simulaciones y análisis estadístico. Un PRNG no produce números verdaderamente aleatorios, sino una secuencia determinista a partir de un valor inicial o semilla. 🧪 Por lo tanto, las pruebas validan que el algoritmo sea robusto y que la secuencia de números exhiba propiedades de aleatoriedad, como uniformidad en la distribución y la ausencia de patrones repetitivos. Esto es crucial para la seguridad y la fiabilidad de los sistemas que dependen de ellos.

prueba de Kolomogorof smirnof

La prueba de Kolmogorov-Smirnov (K-S) es una técnica estadística no paramétrica que permite evaluar si una muestra de datos sigue una distribución teórica específica (como la normal, uniforme, etc.) o comparar si dos muestras provienen de la misma distribución. Su fundamento es medir la máxima diferencia entre las funciones de distribución acumulada de los datos y la distribución de referencia. En R se puede aplicar con ks.test(), indicando los datos y la distribución teórica con sus parámetros, por ejemplo: ks.test(datos, “pnorm”, mean(datos), sd(datos)) para contrastar con la normal, o bien ks.test(x, y) para comparar dos muestras. Si el p-valor obtenido es menor al nivel de significancia (comúnmente 0.05), se rechaza la hipótesis nula, concluyendo que las distribuciones difieren de manera significativa.

ejemplo para verificar si una muestra proviene de una distribucion unifome:

para ello generamos 50 numeros pseudoaleatorios por el metodo secuencial mixto.

R Markdown

a <- 18885 
c <- 2024 
m <- 215400000000
X_n <- 41 # 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] 3.604034e-06 6.806220e-02 3.546127e-01 8.613839e-01 2.345332e-01
##  [6] 1.597897e-01 6.276875e-01 8.777615e-01 5.250673e-01 8.966943e-01
## [11] 7.098482e-02 5.482872e-01 4.041586e-01 5.344902e-01 8.477084e-01
## [16] 9.722949e-01 7.888208e-01 8.811998e-01 4.586937e-01 4.311215e-01
## [21] 7.291934e-01 8.170459e-01 9.122975e-01 7.381375e-01 7.266690e-01
## [26] 1.442569e-01 2.920851e-01 2.704767e-02 7.951753e-01 8.851170e-01
## [31] 4.337111e-01 6.348993e-01 7.398795e-02 2.624672e-01 6.937216e-01
## [36] 9.321661e-01 9.558647e-01 5.047200e-01 6.375760e-01 6.235832e-01
## [41] 3.683821e-01 8.959979e-01 9.198706e-01 7.565045e-01 5.873062e-01
## [46] 2.775264e-01 8.656629e-02 8.044676e-01 3.702971e-01 6.156194e-02
# 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.12667, p-value = 0.3677
## 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]"

COnclusion

Con los 50 números obtenidos mediante el método congruencial mixto, se aplicó la prueba de Kolmogorov-Smirnov con el fin de verificar si los valores simulados siguen una distribución uniforme en el intervalo [0,1]. El resultado entregó un valor-p que, al compararse con el nivel de significancia del 5%, permite decidir si se acepta o se rechaza la hipótesis de uniformidad. En este caso, al ser el valor-p mayor que 0.05, se concluye que los números generados no muestran diferencias significativas respecto a una distribución uniforme, lo que respalda en parte la validez del generador. No obstante, se sugiere complementar con otras pruebas, como la de corridas (Run Test) o la de Póker, para analizar la independencia de los datos y descartar posibles patrones ocultos en la secuencia.

prueba de runtest

La prueba de Kolmogorov-Smirnov (K-S) es una técnica estadística utilizada para comparar una muestra de datos con una distribución teórica, como la uniforme o la normal, y determinar si existen diferencias significativas entre ambas. Su principio consiste en calcular 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 de referencia; si esta diferencia es suficientemente grande, se rechaza la hipótesis nula de que los datos provienen de la distribución teórica. En el contexto de la simulación, esta prueba resulta útil para validar generadores de números pseudoaleatorios, pues permite verificar si los valores obtenidos se ajustan a una distribución uniforme en el intervalo [0,1]. En RStudio, se utiliza la función ks.test() para aplicar esta prueba, indicando como parámetros los datos generados y la distribución con la que se desea contrastar. Por ejemplo, si se generan 50 números pseudoaleatorios mediante el método congruencial mixto, se puede emplear ks.test(datos, “punif”, 0, 1) para comprobar si dichos números siguen una distribución uniforme en [0,1]. Si el valor-p obtenido es mayor que el nivel de significancia (generalmente 0.05), no se rechaza la hipótesis de uniformidad, lo que respalda la validez del generador.

library(tseries)
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
diff(random.number)
##  [1]  0.06805859  0.28655053  0.50677115 -0.62685066 -0.07474356  0.46789781
##  [7]  0.25007399 -0.35269412  0.37162692 -0.82570944  0.47730240 -0.14412866
## [13]  0.13033165  0.31321814  0.12458653 -0.18347406  0.09237900 -0.42250609
## [19] -0.02757225  0.29807190  0.08785254  0.09525157 -0.17415999 -0.01146849
## [25] -0.58241208  0.14782817 -0.26503743  0.76812761  0.08994168 -0.45140581
## [31]  0.20118820 -0.56091139  0.18847928  0.43125435  0.23844446  0.02369864
## [37] -0.45114467  0.13285602 -0.01399286 -0.25520108  0.52761577  0.02387274
## [43] -0.16336612 -0.16919829 -0.30977977 -0.19096013  0.71790129 -0.43417044
## [49] -0.30873520
S<-ifelse(diff(random.number) > 0, 1, 0) # seuencia de ceros y unos
S
##  [1] 1 1 1 0 0 1 1 0 1 0 1 0 1 1 1 0 1 0 0 1 1 1 0 0 0 1 0 1 1 0 1 0 1 1 1 1 0 1
## [39] 0 0 1 1 0 0 0 0 1 0 0
runs.test(as.factor(S))
## 
##  Runs Test
## 
## data:  as.factor(S)
## Standard Normal = 0.75124, p-value = 0.4525
## 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] 28

Conclusion

La prueba de corridas (Run Test) aplicada a la secuencia generada permite evaluar si los números se comportan de manera independiente entre sí. El análisis produce un valor-p que, al compararse con un nivel de significancia como 0.05, determina si se acepta o se rechaza la hipótesis de independencia. Cuando el valor-p es alto, no existen evidencias de patrones o tendencias en los datos, por lo que se concluye que la secuencia mantiene independencia. En cambio, si el valor-p resulta bajo, se interpreta que los números presentan cierta dependencia y, por lo tanto, no son completamente aleatorios. Además, el conteo de corridas contribuye al análisis mostrando cuántas rachas efectivas se formaron en la secuencia, lo cual complementa la interpretación de la prueba.

4 Prueba de Poker

La prueba de Póker es una técnica estadística no paramétrica utilizada para evaluar la aleatoriedad y la uniformidad de una secuencia de números pseudoaleatorios. Se basa en la analogía con el juego de cartas: los números generados se agrupan en bloques (por ejemplo, de 4 o 5 dígitos) y se analizan las combinaciones que se forman, tales como “pares”, “tercias”, “full house”, “póker”, entre otras categorías. La idea es comparar la frecuencia observada de cada tipo de combinación con la frecuencia teórica esperada bajo la hipótesis de que los números provienen de una distribución uniforme y son independientes entre sí.

library(randtoolbox)
## Cargando paquete requerido: rngWELL
## This is randtoolbox. For an overview, type 'help("randtoolbox")'.
## Loading required package: rngWELL
## This is randtoolbox. For an overview, type 'help("randtoolbox")'.

poker.test(random.number,nbcard=5)
## 
##           Poker test
## 
## chisq stat = 4.6, df = 4, p-value = 0.33
## 
##       (sample size : 50)
## 
##  observed number  0 0 3 7 0 
##  expected number  0.016 0.96 4.8 3.8 0.38

Conclusion

La prueba de Póker aplicada a los 50 números pseudoaleatorios generados arrojó un estadístico de chi-cuadrado de 3.9 con 4 grados de libertad y un valor-p de 0.43. Dado que este valor-p es mayor que el nivel de significancia comúnmente usado (0.05), no existe evidencia suficiente para rechazar la hipótesis nula de aleatoriedad. Esto significa que los números obtenidos no presentan diferencias significativas respecto a lo esperado en una distribución uniforme, por lo que se consideran consistentes con un comportamiento aleatorio.