1. Prueba de validacion

Introduccion.
Las pruebas de validación de los números pseudoaleatorios son fundamentales para determinar si una secuencia generada cumple con las propiedades estadísticas necesarias para ser considerada “aleatoria”. Estas pruebas permiten evaluar aspectos como la uniformidad, independencia y distribución de los números producidos por un generador. La prueba de Kolmogorov–Smirnov analiza la desviación máxima entre la función de distribución empírica y la teórica, verificando la uniformidad de los datos. Por su parte, los Run Tests examinan la secuencia de números para identificar patrones o rachas que puedan evidenciar dependencia. La prueba de póker se basa en la analogía con el juego de cartas, agrupando números en combinaciones para verificar la frecuencia esperada de ciertos patrones. En conjunto, estas técnicas ayudan a detectar irregularidades en los generadores. Su correcta aplicación garantiza la confiabilidad de los números usados en simulaciones, criptografía y modelos estadísticos.

2. Prueba de KOLOMOGOROV Sminoff

La Prueba de Kolmogorov–Smirnov (K–S) es una técnica no paramétrica para evaluar si una muestra sigue una distribución teórica (uniforme, normal, etc.) o si dos muestras provienen de la misma población.

Es útil para validar números pseudoaleatorios, ya que permite comprobar si se ajustan a una distribución uniforme.

En R puedes aplicar la prueba con la función ks.test().

Ejemplo 1: Comparar con distribución uniforme (validación de pseudoaleatorios) ### Generar 100 números pseudoaleatorios uniformes datos <- runif(100)

Prueba de Kolmogorov-Smirnov contra distribución uniforme(0,1)

ks.test(datos, “punif”, min(datos), max(datos))

Ejemplo 2: Comparar con distribución normal ### Generar datos normales datos <- rnorm(100, mean = 0, sd = 1)

Prueba K-S contra N(0,1)

ks.test(datos, “pnorm”, mean = 0, sd = 1)

Ejemplo 3: Comparar dos muestras x <- runif(50) y <- runif(50)

ks.test(x, y)

En la salida de R, si el p-valor > 0.05, no se rechaza H0, lo que indica que los datos se ajustan bien a la distribución especificada.

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

a <- 254183 
c <- 2307  
m <- 58561
X_n <- 49 # 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.723040932 0.752531548 0.765936374 0.044756749 0.444220556 0.353067741
##  [7] 0.857089189 0.540735302 0.760574444 0.133228599 0.484435034 0.189528867
## [13] 0.055480610 0.267276857 0.272638787 0.184166937 0.143952460 0.307491334
## [19] 0.109099913 0.382558358 0.870494015 0.819555677 0.160038251 0.042075784
## [25] 0.988456481 0.873174980 0.275319752 0.639931012 0.623845221 0.889260771
## [31] 0.009904202 0.519287580 0.114461843 0.294086508 0.830279538 0.983094551
## [37] 0.961646830 0.315534229 0.476392138 0.822236642 0.615802326 0.521968546
## [43] 0.570225918 0.773979269 0.412048975 0.883898841 0.098376052 0.559502058
## [49] 0.950922969 0.492477929
# 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.072532, p-value = 0.9379
## 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]"

En la prueba de corridas aplicada a la secuencia de 50 números pseudoaleatorios, se obtuvieron 30 corridas observadas frente a un valor esperado cercano a 33, con una varianza estimada de 8.29. El estadístico de contraste calculado fue 𝑍= − 1.04 Z=−1.04, cuyo valor absoluto resulta menor al valor crítico de 1.96 para un nivel de significancia del 5%. Esto significa que no existen evidencias suficientes para rechazar la hipótesis nula de independencia. En consecuencia, los resultados permiten concluir que la secuencia generada no presenta patrones sistemáticos de dependencia y, por tanto, los números pseudoaleatorios pueden considerarse independientes dentro del nivel de confianza establecido.

3 Prueba Runstest.

La prueba de corridas (Runs Test o RunTest) es un método estadístico no paramétrico que se utiliza para evaluar la independencia de una secuencia de números pseudoaleatorios. Su fundamento radica en contar las “corridas”, entendidas como subsecuencias consecutivas de valores que mantienen una misma tendencia (ya sea ascendentes o descendentes, o bien de unos y ceros en una secuencia binaria). Si los números son realmente aleatorios, se espera que la cantidad de corridas observadas sea cercana a la cantidad esperada bajo independencia. De esta manera, la prueba permite detectar la existencia de patrones repetitivos o dependencias en la secuencia, validando así la calidad del generador de números pseudoaleatorios.

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.02949062  0.01340483 -0.72117962  0.39946381 -0.09115282  0.50402145
##  [7] -0.31635389  0.21983914 -0.62734584  0.35120643 -0.29490617 -0.13404826
## [13]  0.21179625  0.00536193 -0.08847185 -0.04021448  0.16353887 -0.19839142
## [19]  0.27345845  0.48793566 -0.05093834 -0.65951743 -0.11796247  0.94638070
## [25] -0.11528150 -0.59785523  0.36461126 -0.01608579  0.26541555 -0.87935657
## [31]  0.50938338 -0.40482574  0.17962466  0.53619303  0.15281501 -0.02144772
## [37] -0.64611260  0.16085791  0.34584450 -0.20643432 -0.09383378  0.04825737
## [43]  0.20375335 -0.36193029  0.47184987 -0.78552279  0.46112601  0.39142091
## [49] -0.45844504
S<-ifelse(diff(random.number) > 0, 1, 0) # seuencia de ceros y unos
S
##  [1] 1 1 0 1 0 1 0 1 0 1 0 0 1 1 0 0 1 0 1 1 0 0 0 1 0 0 1 0 1 0 1 0 1 1 1 0 0 1
## [39] 1 0 0 1 1 0 1 0 1 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

4 Prueba Poker

La prueba del póker es un método estadístico utilizado para evaluar la calidad e independencia de secuencias de números pseudoaleatorios. Su nombre proviene del juego de cartas debido a que clasifica los dígitos de manera similar a las manos del póker.

4.1. Funcionamiento.

El procedimiento consiste en tomar grupos de 5 dígitos de números pseudoaleatorios y clasificarlos según patrones de repetición Prueba de póker. Las categorías principales son:

  • Todos diferentes: Los cinco dígitos son distintos entre sí.
  • Un par: Dos dígitos iguales y tres diferentes.
  • Dos pares: Dos grupos de dígitos iguales.
  • Tercia: Tres dígitos iguales.
  • Full: Una tercia más un par.
  • Poker: Cuatro dígitos iguales.
  • Quintilla: Los cinco dígitos son iguales.

4.2. Propósito.

Esta evaluación permite detectar patrones no deseados en la generación de números aleatorios, ya que examina la frecuencia con que ciertos dígitos se repiten en las secuencias PRUEBA POKER Simulación de Procesos Empresariales. Se utiliza la prueba de chi-cuadrado para comparar las frecuencias observadas con las esperadas teóricamente Poker Test (Sequence Randomness).

  • La prueba es fundamental en simulación computacional para validar que los generadores de números aleatorios produzcan secuencias verdaderamente impredecibles y uniformemente distribuidas.
library(randtoolbox)
## Loading required package: rngWELL
## This is randtoolbox. For an overview, type 'help("randtoolbox")'.
## Loading required package: 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.8
## 
##       (sample size : 50)
## 
##  observed number  0 0 6 4 0 
##  expected number  0.016 0.96 4.8 3.8 0.38