Los números aleatorios son una parte imprescindible de muchos sistemas, incluidas las simulaciones, la criptografía y mucho más. Por lo tanto, la capacidad de producir valores aleatoriamente, sin lógica ni previsibilidad aparentes, se convierte en una función primordial. Dado que las computadoras no pueden producir valores que sean completamente aleatorios, se utilizan algoritmos, conocidos como generadores de números pseudoaleatorios (PRNG) , para realizar esta tarea.
Los valores producidos por los PRNG no son realmente aleatorios y dependen del valor inicial proporcionado al algoritmo, conocido como valor inicial. La propiedad de que una secuencia pseudoaleatoria sea reproducible, dado su valor inicial, es esencial para su aplicación en simulaciones, como la simulación de Monte Carlo, donde es posible que el sistema deba probarse en la misma secuencia más de una vez.
Algunos de los PRNG más populares y más utilizados son:
- Mersenne Twister: se utiliza como generador de números aleatorios predeterminado en Python, R, Excel, Matlab, Ruby y muchos otros sistemas de software populares.
- Generador congruencial lineal: utilizado en C++ y Java
- Generador Wichmann-Hill: se usa en Excel y era el predeterminado en Python 2.2
- Generador Park-Miller
- Secuencia de Weyl del cuadrado medio
Para garantizar que los valores generados por el PRNG sean lo más aleatorios posible, se utilizan varias pruebas estadísticas, incluidas las pruebas Diehard, la serie TestU01, la prueba Chi-Square y la prueba Runs of Randomness. Este artículo se centra en la Prueba de rachas de aleatoriedad.
¿Qué es la Prueba de Carreras?
Una corrida se define como una serie de valores crecientes o decrecientes. El número de valores crecientes o decrecientes es la duración de la ejecución.
- El primer paso para aplicar esta prueba es formular la hipótesis nula y alternativa.
H nulo : la secuencia se produjo de forma aleatoria
H alt : La secuencia no se produjo de manera aleatoria
- Calcule el estadístico de prueba, Z como:
Python3
# simple code to implement Runs # test of randomnes import random import math import statistics def runsTest(l, l_median): runs, n1, n2 = 0, 0, 0 # Checking for start of new run for i in range(len(l)): # no. of runs if (l[i] >= l_median and l[i-1] < l_median) or \ (l[i] < l_median and l[i-1] >= l_median): runs += 1 # no. of positive values if(l[i]) >= l_median: n1 += 1 # no. of negative values else: n2 += 1 runs_exp = ((2*n1*n2)/(n1+n2))+1 stan_dev = math.sqrt((2*n1*n2*(2*n1*n2-n1-n2))/ \ (((n1+n2)**2)*(n1+n2-1))) z = (runs-runs_exp)/stan_dev return z # Making a list of 100 random numbers l = [] for i in range(100): l.append(random.random()) l_median= statistics.median(l) Z = abs(runsTest(l, l_median)) print('Z-statistic= ', Z)
Producción:
Z-statistic= 1.809160364503323
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA