Introduccion
Las pruebas de validación de números pseudoaleatorios se utilizan para
evaluar si una secuencia generada se comporta de manera aleatoria y
uniforme. Entre ellas, la prueba de Kolmogorov-Smirnoff
compara la distribución empírica de los números con la distribución
teórica esperada. Run tests analizan la ocurrencia de
secuencias ascendentes o descendentes para detectar patrones. La
prueba Poker clasifica combinaciones de números
similares a manos de póker para identificar irregularidades en la
frecuencia de aparición. Estas pruebas permiten garantizar que los
números pseudoaleatorios sean adecuados para simulaciones y modelos
estadísticos.
Generando 50 numeros pseudoaleatoris por el metodo secuencial mixt.
a <- 15968
c <- 1154
m <- 2.15
X_n <- 39 # 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.837209302 0.302325773 0.282124928 0.715030141 0.345482361 0.406522894
## [7] 0.101750390 0.494418968 0.626265662 0.954272525 0.567867230 0.448110481
## [13] 0.172341180 0.688152471 0.162842802 0.018047728 0.930304312 0.843439316
## [19] 0.783191489 0.745885119 0.037767876 0.821634911 0.610440669 0.260787668
## [25] 0.001664484 0.322669333 0.128093647 0.143539542 0.783585083 0.030790093
## [31] 0.400387970 0.139291359 0.948602923 0.035667316 0.279892418 0.066319335
## [37] 0.731323770 0.522148741 0.415276847 0.884886309 0.608768257 0.555708846
## [43] 0.303044155 0.753258909 0.782447850 0.871457930 0.184409660 0.397638301
## [49] 0.232582649 0.623924496
# 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.084723, p-value = 0.8358
## 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]"
Los números generados por el método secuencial mixto muestran un comportamiento cercano a la uniformidad. La prueba de Kolmogorov-Smirnov indicó que no se rechaza la hipótesis de uniformidad. Por lo tanto, la secuencia puede considerarse válida para simulaciones básicas.
library(tseries)
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
diff(random.number)
## [1] -0.53488353 -0.02020085 0.43290521 -0.36954778 0.06104053 -0.30477250
## [7] 0.39266858 0.13184669 0.32800686 -0.38640530 -0.11975675 -0.27576930
## [13] 0.51581129 -0.52530967 -0.14479507 0.91225658 -0.08686500 -0.06024783
## [19] -0.03730637 -0.70811724 0.78386703 -0.21119424 -0.34965300 -0.25912318
## [25] 0.32100485 -0.19457569 0.01544589 0.64004554 -0.75279499 0.36959788
## [31] -0.26109661 0.80931156 -0.91293561 0.24422510 -0.21357308 0.66500444
## [37] -0.20917503 -0.10687189 0.46960946 -0.27611805 -0.05305941 -0.25266469
## [43] 0.45021475 0.02918894 0.08901008 -0.68704827 0.21322864 -0.16505565
## [49] 0.39134185
S<-ifelse(diff(random.number) > 0, 1, 0) # seuencia de ceros y unos
S
## [1] 0 0 1 0 1 0 1 1 1 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 1 1 0 1 0 1 0 1 0 1 0 0
## [39] 1 0 0 0 1 1 1 0 1 0 1
runs.test(as.factor(S))
##
## Runs Test
##
## data: as.factor(S)
## Standard Normal = 2.0642, p-value = 0.039
## 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] 32
num_corridas <- sum(diff(random.number) != 0) + 1
num_corridas
## [1] 50
La prueba Run Test aplicada a los números generados indica que las corridas observadas no muestran patrones sistemáticos. El valor p sugiere que la secuencia es aleatoria. Por lo tanto, los números pueden considerarse independientes y aptos para simulaciones.
2.2 Prueba Póker
Los números pseudoaleatorios \(u_i\) se
agrupan en combinaciones de varios dígitos decimales (típicamente grupos
de 5 decimales). Los grupos se clasifican de manera similar a las manos
en el juego de póker:
En R se aplica con la función poker.test() del paquete randtoolbox.
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 = 1.7, df = 4, p-value = 0.79
##
## (sample size : 50)
##
## observed number 0 0 5 5 0
## expected number 0.016 0.96 4.8 3.8 0.38
La Prueba de Póker evalúa si los números pseudoaleatorios presentan patrones similares a las “manos” en el póker (pares, tercia, full house, etc.). Si la prueba arroja un p-valor alto (mayor a 0.05), significa que la distribución de las combinaciones observadas no difiere significativamente de la esperada, por lo que los números pueden considerarse aleatorios en cuanto a su patrón de dígitos.
En cambio, si el p-valor es bajo (menor a 0.05), indica que los números presentan regularidades o repeticiones que no corresponden al comportamiento esperado de un generador aleatorio, y por tanto se rechaza la hipótesis de aleatoriedad.