Prueba de validación.

Introducción
Las pruebas de validación de números pseudoaleatorios buscan verificar si una secuencia generada cumple con las propiedades estadísticas de aleatoriedad. La prueba de Kolmogorov-Smirnov evalúa si la distribución de los números sigue una distribución uniforme. La Run Test o prueba de corridas analiza la independencia de los números, comprobando que no se formen patrones consecutivos. La prueba de Póker examina la frecuencia de aparición de ciertos patrones en los dígitos, similar al juego de cartas, para detectar irregularidades. Estas pruebas permiten determinar la calidad y confiabilidad de los generadores de números pseudoaleatorios.

  1. Prueba de Kolomogorov 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 bien compara dos muestras entre sí. En validación de números pseudoaleatorios se usa para verificar si los valores generados siguen una distribución uniforme en el intervalo [ 0 , 1] [0,1].

En R, se utiliza con la función ks.test(). Ejemplo:

Generar 100 números pseudoaleatorios uniformes x <- runif(100)

Prueba Kolmogorov-Smirnov contra la distribución uniforme ks.test(x, “punif”, 0, 1)

El resultado mostrará un p-valor; si es mayor que 0.05, no se rechaza la hipótesis nula de que los números provienen de una distribución uniforme.

Generando 50 números pseudoaleatorios por el metodo secuencial mixto

a <- 23896 
c <- 32897  
m <- 12345701
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] 0.08202313 0.02730546 0.49385005 0.04335080 0.91335259 0.47618681
##  [7] 0.96272208 0.20959328 0.44374839 0.81430402 0.61161557 0.16841409
## [13] 0.42576059 0.97783609 0.37388262 0.30168323 0.02521720 0.59285406
## [19] 0.84335713 0.86471436 0.21712935 0.52554756 0.48708672 0.42691379
## [25] 0.53458252 0.38665597 0.53373251 0.07475760 0.41031862 0.97641349
## [31] 0.37942187 0.66774783 0.50470856 0.51846493 0.24062271 0.92288190
## [37] 0.18855535 0.72136042 0.63114764 0.90657274 0.46489300 0.08584106
## [43] 0.26051773 0.33434116 0.41903688 0.30789406 0.43911383 0.06664927
## [49] 0.65369937 0.80287616
# 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.14542, p-value = 0.2186
## 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]"

generamos numeros aleatorios para poder realizar la prueba de Kolmogorov-Smirnov y obtubimos estos resultados, por consiguiente se puede decir que los datos siguen una distribucion uniforme.

  1. Prueva Runtest La Run Test o prueba de corridas es una prueba no paramétrica que evalúa la independencia de una secuencia de números pseudoaleatorios. Se basa en contar las corridas, es decir, las subsecuencias de valores consecutivos que están por encima o por debajo de la media. Si el número de corridas observadas difiere mucho del esperado en una secuencia verdaderamente aleatoria, se sospecha dependencia o patrón en los datos. Es ampliamente usada para validar generadores de números pseudoaleatorios porque detecta repeticiones o tendencias.
library(tseries)
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
diff(random.number)
##  [1] -0.05471767  0.46654459 -0.45049925  0.87000179 -0.43716578  0.48653527
##  [7] -0.75312880  0.23415511  0.37055563 -0.20268845 -0.44320148  0.25734650
## [13]  0.55207550 -0.60395347 -0.07219938 -0.27646603  0.56763686  0.25050307
## [19]  0.02135723 -0.64758502  0.30841821 -0.03846084 -0.06017293  0.10766873
## [25] -0.14792655  0.14707654 -0.45897491  0.33556102  0.56609487 -0.59699162
## [31]  0.28832595 -0.16303926  0.01375637 -0.27784222  0.68225919 -0.73432655
## [37]  0.53280506 -0.09021278  0.27542511 -0.44167974 -0.37905195  0.17467667
## [43]  0.07382343  0.08469572 -0.11114282  0.13121977 -0.37246455  0.58705010
## [49]  0.14917679
S<-ifelse(diff(random.number) > 0, 1, 0) # seuencia de ceros y unos
S
##  [1] 0 1 0 1 0 1 0 1 1 0 0 1 1 0 0 0 1 1 1 0 1 0 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0
## [39] 1 0 0 1 1 1 0 1 0 1 1
runs.test(as.factor(S))
## 
##  Runs Test
## 
## data:  as.factor(S)
## Standard Normal = 3.07, p-value = 0.00214
## alternative hypothesis: two.sided
num_corridas <- sum(diff(random.number) != 0) + 1
num_corridas
## [1] 50
# 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] 36

con la prueba runtest nos dio 36 corridas y al compararlo con Z nos dio que los numeros pseudoaleatorios son independientes

Prueba Poker.

Introducción 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:

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

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

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

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

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

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

  7. 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 = 61, df = 4, p-value = 1.7e-12
## 
##       (sample size : 50)
## 
##  observed number  1 1 5 3 0 
##  expected number  0.016 0.96 4.8 3.8 0.38