En la generación de números pseudoaleatorios, un requisito fundamental es que estos sigan una distribución uniforme en el intervalo definido, generalmente La uniformidad asegura que cada subintervalo tenga la misma probabilidad de ocurrencia, lo cual es indispensable en aplicaciones como la simulación, la criptografía y el modelado estadístico.
Para comprobar si un conjunto de números generados se ajusta a una distribución uniforme, se recurre a la prueba de bondad de ajuste Chi-cuadrado ( Esta prueba contrasta la frecuencia observada de los datos en diferentes intervalos con la frecuencia esperada bajo la hipótesis de que los números provienen de una distribución uniforme.
La generación de números pseudoaleatorios constituye un proceso fundamental en la simulación de sistemas, el modelado estadístico y diversas aplicaciones de la ingeniería y la informática. Sin embargo, debido a que estos números son generados mediante algoritmos determinísticos, es necesario verificar que sus propiedades estadísticas se aproximen a las de una verdadera secuencia aleatoria. Una de las principales características deseadas es que los números se distribuyan de manera uniforme dentro de un intervalo, generalmente.
Para comprobar esta propiedad, se emplea la prueba de bondad de ajuste Chi–cuadrada la cual permite contrastar si la frecuencia observada de los números en diferentes subintervalos del rango coincide, dentro de un margen de error, con la frecuencia esperada bajo la hipótesis de que siguen una distribución uniforme. En este contexto, la hipótesis nula (H0)establece que los números provienen de una distribución uniforme, mientras que la hipótesis alternativa (H1) sostiene que no lo hacen.
De esta forma, la prueba Chi–cuadrada se convierte en una herramienta estadística esencial para validar la calidad de un generador de números pseudoaleatorios, asegurando que las simulaciones y experimentos computacionales basados en ellos se apoyen en secuencias con un comportamiento estadístico adecuado.
El estadistico de prueba es: \[ \chi^2 \;=\; \sum_{i=1}^{k} \frac{(O_i - E_i)^2}{E_i} \]
La fórmula de la prueba Chi–cuadrada representa el estadístico que permite medir qué tan diferentes son las frecuencias observadas (\(O_i\)) en cada intervalo respecto a las frecuencias esperadas (\(E_i\)) bajo la hipótesis de que los datos siguen una distribución uniforme. En esencia, para cada intervalo se calcula la diferencia entre lo observado y lo esperado, se eleva al cuadrado para eliminar signos negativos y se divide entre la frecuencia esperada, de modo que se normaliza la magnitud de la diferencia. Finalmente, se suman todos esos aportes y se obtiene un valor \(\chi^2\) que refleja el grado de ajuste entre los datos y la distribución teórica. Mientras más cercano sea \(\chi^2\) a cero, mejor será la concordancia con la uniformidad; en cambio, valores grandes indican que los números pseudoaleatorios no se distribuyen de manera uniforme.
Ejemplo
a <- 16807
c <- 2158
m <- 2147483647
X_n <- 50 # 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.0003923234 0.5937797169 0.6557032325 0.4042290158 0.8770689810
## [6] 0.8983647623 0.8165603526 0.9298471762 0.9414906264 0.6329589270
## [11] 0.1406874448 0.5338853968 0.0118650217 0.4154201529 0.9665108970
## [16] 0.1486472376 0.3141239920 0.4819349374 0.8804940083 0.4627976755
## [21] 0.2405330875 0.6396028626 0.8053126614 0.8899005400 0.5583759516
## [26] 0.6246200230 0.9887277125 0.5466655444 0.8078059129 0.7939798770
## [31] 0.4197944908 0.4860071472 0.3221244874 0.9462608169 0.8055499419
## [36] 0.8778739543 0.4275510308 0.8501764354 0.9153500977 0.2890923397
## [41] 0.7749545094 0.6604396657 0.0094630439 0.0453796280 0.6954085118
## [46] 0.7308582397 0.5344354005 0.2557775868 0.8539029620 0.5470831834
library(agricolae)
histo <- hist(random.number, breaks=6)
Tabla <- table.freq(histo)
lim_inf <-Tabla$Lower #limite inferior del intervalo
lim_sup <- Tabla$Upper # limite superior del intervalo
obser <- Tabla$Frequency
Ei <- length(random.number)/length(obser) # Valor esperado en una uniforme es E= n/#intervalos
cbind(lim_inf,lim_sup,obser,Ei) # visualizacion de las frecuencias observadas y esperadas en los intervalos.
## lim_inf lim_sup obser Ei
## [1,] 0.0 0.2 6 10
## [2,] 0.2 0.4 5 10
## [3,] 0.4 0.6 13 10
## [4,] 0.6 0.8 9 10
## [5,] 0.8 1.0 17 10
x2 <- (obser-Ei)^2/Ei
x2
## [1] 1.6 2.5 0.9 0.1 4.9
chicuad <- sum(x2)
chicuad # Estadistica chi cuadrada
## [1] 10
dchi <- qchisq(0.05,length(obser)-1,lower.tail=F)# valor de la distribución chi cuadrada con k-1 grado de libertad y nivel de signiicancia 0.05
# Decisión estadística
ifelse(chicuad < dchi,"Los $U_i$ provienen de una distribución uniforme [0,1]", "Los $U_i no siguen una uniforme [0,1] ")
## [1] "Los $U_i no siguen una uniforme [0,1] "