Prueba de validacion.

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.

1. Prueba de kolomogorov Smirnoff

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.

2. Prueba Runtest

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

3. Prueba Poker

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:

a. Todo diferente (TD):

Ningún decimal se repite en el grupo (Ej: 0.12345). la probabilidad de este evento es: P(TD)=0.3024

b. Un par (1p):

Un decimal aparece dos veces y los demás son diferentes (Ej: 0.14345). P(1p)=0.5040

c. Dos pares (2p):

Dos decimales aparecen dos veces cada uno (Ej: 0.14224). P(2p)=0.1080

d. Tercia (T):

Un decimal aparece tres veces, y los otros dos son diferentes (Ej: 0.41443). P(T)=0.0720

e. Full House (FH):

Un dígito aparece tres veces y otro dígito dos veces (Ej: 0.32223). P(FH)=0.0090

f. Poker (p):

Un dígito aparece cuatro veces (Ej: 0.55515). P(p)=0.0045

g. Quintilla:

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