PRUEBA DE VALIDACION

Introduccion: las pruebas de validación de números pseudoaleatorios buscan determinar si una secuencia generada por un algoritmo presenta propiedades cercanas al verdadero azar. Entre las más usadas está la prueba de Kolmogorov-Smirnov, que compara la distribución empírica de los números con la distribución uniforme ideal. La prueba de rachas (Run Tests) analiza la secuencia para verificar la aleatoriedad en el orden y la ausencia de patrones sistemáticos. Por su parte, la prueba Póker evalúa subconjuntos de dígitos en la secuencia, clasificándolos en combinaciones similares a las del juego de póker, para medir uniformidad y aleatoriedad en su agrupación.

1 PRUEBA DE KOLMOGOROV-SMIRNOV

permite verificar si una muestra de números sigue una distribución teórica, usualmente la uniforme. Para ello calcula el estadístico \(D\), definido como la mayor diferencia entre la distribución acumulada empírica de la muestra y la distribución acumulada esperada. En RStudio se aplica tomando la muestra generada y comparándola con la distribución de referencia (por ejemplo, uniforme entre 0 y 1). El resultado entrega el valor de \(D\) y un p-valor: si este último es mayor que el nivel de significancia (0,05), se acepta que la muestra es consistente con la distribución uniforme; de lo contrario, se rechaza la hipótesis de aleatoriedad uniforme.

Generando los 50 números U_i Pseudoaleatorios con el método secuencial mixto.

a <- 16853
c <- 2056
m <- 2357000000000
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] 3.011803e-07 5.075793e-03 5.423344e-01 9.621806e-01 6.300482e-01
##  [6] 2.024403e-01 7.259146e-01 8.387396e-01 2.777658e-01 1.867549e-01
## [11] 3.811723e-01 8.969062e-01 5.608401e-01 8.386480e-01 7.349478e-01
## [16] 7.544049e-02 3.985196e-01 2.500404e-01 9.309031e-01 5.104430e-01
## [21] 4.960878e-01 5.674650e-01 4.875637e-01 9.103670e-01 4.157792e-01
## [26] 1.264584e-01 2.042345e-01 9.640007e-01 3.033308e-01 3.338963e-02
## [31] 7.154632e-01 7.018951e-01 3.838500e-02 9.024208e-01 4.985125e-01
## [36] 4.312474e-01 8.117469e-01 3.709536e-01 6.803506e-01 9.481659e-01
## [41] 4.402638e-01 7.654042e-01 3.574904e-01 7.863185e-01 8.248764e-01
## [46] 6.418074e-01 3.807013e-01 9.583719e-01 4.412273e-01 3.469506e-03
# 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.09749, p-value = 0.6923
## 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]"

Al usar la prueba de Kolmogorov-Smirnov pudimos evaluar si los 50 números pseudoaleatorios generados siguen una distribución uniforme haciendo las respectivas verificaciones con las lineas de codigo usadas posteriormente a la generacion aleatoria de numeros

2 PRUEBA RUNTESTS

examina el orden en que aparecen los números pseudoaleatorios para detectar patrones que contradigan la hipótesis de aleatoriedad. Evalúa la secuencia de aumentos y disminuciones (o de valores mayores y menores respecto a la media), contabilizando las “rachas” consecutivas. Si el número de rachas difiere significativamente de lo esperado bajo aleatoriedad, se concluye que los datos presentan dependencia o estructura no aleatoria.

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.005075492  0.537258639  0.419846192 -0.332132416 -0.427607935
##  [6]  0.523474327  0.112824959 -0.560973774 -0.091010834  0.194417358
## [11]  0.515733931 -0.336066112  0.277807886 -0.103700202 -0.659507323
## [16]  0.323079067 -0.148479151  0.680862727 -0.420460117 -0.014355226
## [21]  0.071377209 -0.079901335  0.422803383 -0.494587867 -0.289320728
## [26]  0.077776050  0.759766174 -0.660669907 -0.269941134  0.682073603
## [31] -0.013568119 -0.663510115  0.864035845 -0.403908341 -0.067265146
## [36]  0.380499567 -0.440793366  0.309397010  0.267815350 -0.507902146
## [41]  0.325140455 -0.407913794  0.428828016  0.038557938 -0.183068955
## [46] -0.261106173  0.577670614 -0.517144589 -0.437757781
S<-ifelse(diff(random.number) > 0, 1, 0) # seuencia de ceros y unos
S
##  [1] 1 1 1 0 0 1 1 0 0 1 1 0 1 0 0 1 0 1 0 0 1 0 1 0 0 1 1 0 0 1 0 0 1 0 0 1 0 1
## [39] 1 0 1 0 1 1 0 0 1 0 0
runs.test(as.factor(S))
## 
##  Runs Test
## 
## data:  as.factor(S)
## Standard Normal = 1.9106, p-value = 0.05605
## alternative hypothesis: two.sided

de acuerdo con los resutados obtenidos, se rechaza la hipotesis nula. Por lo tanto podemos concluir que no son independientes

# 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] 32

En este trabajo se generaron 50 números pseudoaleatorios a los cuales se les aplicaron 2 pruebas de validación. La Kolmogorov-Smirnov indicó si la secuencia se ajustaba a la distribución uniforme, mientras que la prueba de rachas analizó la independencia de los valores mediante sus corridas. Los resultados mostraron que, aunque los números presentan uniformidad en su distribución, las rachas sugieren dependencia en el orden, lo cual evidencia limitaciones en la calidad del generador utilizado.

3 PRUEBA POKER

Introduccion es un test estadístico para validar generadores de números pseudoaleatorios, en el cual los dígitos generados se agrupan en bloques y se clasifican según combinaciones similares a las manos de póker (pares, tríos, full house, etc.); luego se comparan las frecuencias observadas de estos patrones con las frecuencias teóricas esperadas mediante una prueba de bondad de ajuste, normalmente chi-cuadrado, con el fin de detectar desviaciones sutiles de la aleatoriedad que otras pruebas podrían pasar por alto, aunque por sí sola no garantiza aleatoriedad perfecta y por eso se utiliza junto a otros métodos de validación.

Proposito El propósito de la prueba póker es evaluar si un generador de números pseudoaleatorios produce secuencias cuyos patrones de dígitos ocurren con las frecuencias esperadas en una distribución verdaderamente aleatoria, detectando irregularidades o sesgos en la generación de números que podrían pasar desapercibidos con pruebas más simples y asegurando así una validación más rigurosa cuando se combina con otros métodos estadísticos.

3.1 Prueba Poker

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:

Todo diferente (TD): Ningún decimal se repite en el grupo (Ej: 0.12345). la probabilidad de este evento es: P(TD)=0.3024 Un par (1p): Un decimal aparece dos veces y los demás son diferentes (Ej: 0.14345). P(1p)=0.5040

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

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

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

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

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")'.

3.2 TESTEO

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

Dado que el valor p es mayor a 0.5 podemos concluir que los datos analizados son consistentes con una distribución uniforme, lo que respalda la validez del modelo o la tesis planteada sobre dicho comportamiento.