Pruebas de Validación.

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.

  1. Prueba de Kolomogorv Smirnoff
    La prueba de Kolmogorov-Smirnov (K-S) es una prueba no paramétrica 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í. Su objetivo es evaluar si los datos siguen la distribución esperada. El estadístico K-S mide la máxima diferencia entre ambas distribuciones acumuladas.

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]"

Conclusión

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.

  1. Prueba Runtests
    La prueba de rachas (Runs Test) es una prueba no paramétrica utilizada para verificar la independencia de una secuencia de números pseudoaleatorios. Se basa en contar las rachas, es decir, subsecuencias consecutivas de valores por encima o por debajo de la media. Si los números son realmente independientes, la cantidad de rachas observadas debe ser similar a la esperada en una secuencia aleatoria. Una desviación significativa indicaría dependencia o patrones en la generación de los números.
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

Conclusión

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.

  1. Prueba Poker

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:

  • Todo diferente (TD): Ningún decimal se repite en el grupo (Ej: 0.12345).
    Probabilidad: \(P(TD)=0.3024\)
  • Un par (1p): Un decimal aparece dos veces y los demás son diferentes (Ej: 0.14345).
    Probabilidad: \(P(1p)=0.5040\)
  • Dos pares (2p): Dos decimales aparecen dos veces cada uno (Ej: 0.14224).
    Probabilidad: \(P(2p)=0.1080\)
  • Tercia (T): Un decimal aparece tres veces, y los otros dos son diferentes (Ej: 0.41443).
    Probabilidad: \(P(T)=0.0720\)
  • Full House (FH): Un dígito aparece tres veces y otro dígito dos veces (Ej: 0.32223).
    Probabilidad: \(P(FH)=0.0090\)
  • Póker (P): Un dígito aparece cuatro veces (Ej: 0.55515).
    Probabilidad: \(P(P)=0.0045\)
  • Quíntilla (Q): Todos los dígitos son iguales (Ej: 0.11111).
    Probabilidad: \(P(Q)=0.0001\)

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 = 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

Conclusión

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.