Introduccion
Las pruebas de validación de
números pseudoaleatorios buscan verificar que una secuencia generada
tenga propiedades cercanas al azar real. Entre ellas, la prueba
de Kolmogorov-Smirnov compara la distribución empírica de los
números con la distribución uniforme esperada. La Run Test (o
prueba de corridas) evalúa la secuencia de números para
comprobar que no existan patrones repetitivos o demasiadas secuencias
largas de valores crecientes/disminuyentes. Finalmente, la
prueba de Póker analiza bloques de números como si
fueran “manos de cartas”, revisando la frecuencia de combinaciones
(pares, tríos, etc.) y contrastándola con lo esperado en un proceso
aleatorio. Estas pruebas permiten identificar sesgos y deficiencias en
los generadores de números pseudoaleatorios
Generando 50 numeros pseudoaleatorios por el metodo secuencial mixto.
a <- 34432
c <- 12
m <- 1231331
X_n <- 45 # 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.25835539 0.69277798 0.73133625 0.36988024 0.71627125 0.65184260
## [7] 0.24439895 0.14455821 0.42814889 0.02256583 0.98649997 0.16712890
## [13] 0.58241854 0.83508740 0.72927344 0.34325945 0.10934103 0.83035999
## [19] 0.95527360 0.98068432 0.92239211 0.80516368 0.39586025 0.26020786
## [25] 0.47692050 0.32677241 0.42767623 0.74796216 0.83325848 0.75606478
## [31] 0.82246934 0.26446747 0.14409610 0.51706730 0.66140705 0.56743556
## [37] 0.94133665 0.10358222 0.54304976 0.28923336 0.88299409 0.25263313
## [43] 0.66381339 0.42250540 0.70603518 0.20320937 0.90512787 0.36268152
## [49] 0.85014265 0.11175224
# 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.11184, p-value = 0.5228
## 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]"
Conclusion de lo obtenido: Generamos unos numeros aleatorios y se relizo la prueba de Kolmogorov-Smirnov para comprobar la la aleatoridad de los numeros obtenidos. Por medio de estos metodos realizados se llega a la conclusion de que los numeros generados siguen la distribucion uniforme.
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.43442259 0.03855828 -0.36145602 0.34639102 -0.06442865 -0.40744365
## [7] -0.09984074 0.28359068 -0.40558306 0.96393415 -0.81937107 0.41528963
## [13] 0.25266886 -0.10581395 -0.38601400 -0.23391842 0.72101896 0.12491361
## [19] 0.02541071 -0.05829221 -0.11722843 -0.40930343 -0.13565240 0.21671265
## [25] -0.15014809 0.10090382 0.32028593 0.08529632 -0.07719370 0.06640457
## [31] -0.55800187 -0.12037137 0.37297120 0.14433974 -0.09397148 0.37390109
## [37] -0.83775443 0.43946754 -0.25381640 0.59376074 -0.63036097 0.41118026
## [43] -0.24130798 0.28352977 -0.50282580 0.70191849 -0.54244634 0.48746113
## [49] -0.73839041
S<-ifelse(diff(random.number) > 0, 1, 0) # seuencia de ceros y unos
S
## [1] 1 1 0 1 0 0 0 1 0 1 0 1 1 0 0 0 1 1 1 0 0 0 0 1 0 1 1 1 0 1 0 0 1 1 0 1 0 1
## [39] 0 1 0 1 0 1 0 1 0 1 0
runs.test(as.factor(S))
##
## Runs Test
##
## data: as.factor(S)
## Standard Normal = 2.4583, p-value = 0.01396
## 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] 34
relizamos la prueba RunTest con los numeros que genaramos anteriormente. Al realizar esta prueba, nos arroja que el numero de corridas en 34, este resultado se encuentra en el rango esperado. Esto nos confirma que nuestro modelo no presenta ningun tipo de secuencia o patron y esto significa que los numeros son generados presentan una aleatoriedad.
La prueba de Póker evalúa la independencia y uniformidad de una secuencia de números pseudoaleatorios. Consiste en agrupar los números en bloques (como si fueran manos de cartas) y clasificar las combinaciones según repeticiones de dígitos (todos distintos, un par, doble par, trío, etc.). Luego, se comparan las frecuencias observadas de cada tipo de combinación con las frecuencias teóricas esperadas en un proceso aleatorio. Si las diferencias son grandes, se sospecha que el generador no es realmente aleatorio.
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 = 6.7, df = 4, p-value = 0.15
##
## (sample size : 50)
##
## observed number 0 3 2 5 0
## expected number 0.016 0.96 4.8 3.8 0.38