Introducción
Las pruebas de validación de números pseudoaleatorios permiten verificar
que una secuencia generada cumple con propiedades de aleatoriedad
necesarias para su uso en simulaciones o modelos estadísticos. La prueba
de Kolmogorov-Smirnov mide la uniformidad de la distribución comparando
la función empírica con la teórica. La Run Test analiza la secuencia de
números para comprobar la independencia, evaluando la longitud y
frecuencia de las corridas ascendentes o descendentes. La prueba Póker
se inspira en el juego de cartas y examina patrones en los dígitos de
los números generados, identificando si aparecen con la frecuencia
esperada. Estas pruebas en conjunto permiten determinar si los números
se pueden considerar suficientemente aleatorios.
La prueba de Kolmogorov-Smirnov (Smirnov) se usa para comprobar si una muestra de números pseudoaleatorios sigue una distribución específica (generalmente uniforme). Evalúa la diferencia máxima entre la distribución empírica de la muestra y la teórica, indicando si los datos se ajustan a lo esperado.
Generando 50 número Pseudoaleatorios por el método secuencial mixto.
a <- 255
c <- 1395
m <- 15777
X_n <- 21 # 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.427837992 0.187107815 0.800912721 0.321163719 0.985168283 0.306332002
## [7] 0.203080434 0.873930405 0.940673132 0.960068454 0.905875642 0.086708500
## [13] 0.199087279 0.855675984 0.285795779 0.966343411 0.505989732 0.115801483
## [19] 0.617798060 0.626925271 0.954363948 0.451226469 0.151169424 0.636622932
## [25] 0.427267541 0.041642898 0.707358813 0.464917285 0.642327439 0.881916714
## [31] 0.977181974 0.269823160 0.893325727 0.886480319 0.140901312 0.018254421
## [37] 0.743297205 0.629207074 0.536223617 0.825442099 0.576155163 0.007986309
## [43] 0.124928694 0.945236737 0.123787792 0.654306902 0.936679977 0.941814033
## [49] 0.250998289 0.092983457
# 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.15568, p-value = 0.1592
## 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
Generamos unos números aleatorios, y realizamos pruebas con el método
kolmogorov el cuál, sirvió para comparar los resultados de lo que
habíamos realizado con anterioridad en el excel, y se llegó a la
conclusión de que los números siguen una distribución uniforme tanto en
el excel como en R.
library(tseries)
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
diff(random.number)
## [1] -0.240730177 0.613804906 -0.479749002 0.664004564 -0.678836281
## [6] -0.103251569 0.670849971 0.066742727 0.019395322 -0.054192812
## [11] -0.819167142 0.112378779 0.656588705 -0.569880205 0.680547633
## [16] -0.460353679 -0.390188249 0.501996577 0.009127210 0.327438677
## [21] -0.503137479 -0.300057045 0.485453508 -0.209355391 -0.385624643
## [26] 0.665715916 -0.242441529 0.177410154 0.239589276 0.095265260
## [31] -0.707358813 0.623502567 -0.006845408 -0.745579007 -0.122646891
## [36] 0.725042784 -0.114090131 -0.092983457 0.289218483 -0.249286937
## [41] -0.568168853 0.116942384 0.820308043 -0.821448945 0.530519110
## [46] 0.282373075 0.005134056 -0.690815744 -0.158014832
S<-ifelse(diff(random.number) > 0, 1, 0) # seuencia de ceros y unos
S
## [1] 0 1 0 1 0 0 1 1 1 0 0 1 1 0 1 0 0 1 1 1 0 0 1 0 0 1 0 1 1 1 0 1 0 0 0 1 0 0
## [39] 1 0 0 1 1 0 1 1 1 0 0
runs.test(as.factor(S))
##
## Runs Test
##
## data: as.factor(S)
## Standard Normal = 1.014, p-value = 0.3106
## 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] 29
Conclusión
La prueba RunTest permitió evaluar la independencia de la secuencia de
números pseudoaleatorios generados. El número de corridas observado se
ajustó al esperado bajo la hipótesis nula, indicando ausencia de
patrones deterministas. Por tanto, se concluye que los números presentan
un comportamiento consistente con una distribución aleatoria.
3.Prueba Poker
La prueba Póker es una técnica de validación de números pseudoaleatorios inspirada en el juego de cartas. Consiste en agrupar los números generados en bloques de dígitos y clasificar los patrones que aparecen (por ejemplo: pares, tríos, full, todos diferentes, etc.). Luego, se compara la frecuencia observada de cada patrón con la frecuencia esperada bajo la hipótesis de aleatoriedad. Si las diferencias son pequeñas, se acepta que los números cumplen con la propiedad de aleatoriedad; si no, se concluye que la secuencia presenta patrones no deseados.
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")'.
poker.test(random.number,nbcard=5)
##
## Poker test
##
## chisq stat = 2.6, df = 4, p-value = 0.64
##
## (sample size : 50)
##
## observed number 0 2 3 5 0
## expected number 0.016 0.96 4.8 3.8 0.38