Ejecuta la prueba de aleatoriedad en Python

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:

  1. Mersenne Twister:  se utiliza como generador de números aleatorios predeterminado en Python, R, Excel, Matlab, Ruby y muchos otros sistemas de software populares.
  2. Generador congruencial lineal: utilizado en C++ y Java
  3.  Generador Wichmann-Hill: se usa en Excel y era el predeterminado en Python 2.2
  4.  Generador Park-Miller
  5.  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:            
\qquad\,Z = \frac{R - \bar{R}}{s_R}





\qquad\,\bar{R} = \frac{2 n_1 n_2}{n_1 + n_2} + 1



\qquad\,s_{R}^2 = \frac{2 n_1 n_2(2 n_1 n_2 - n_1 - n_2)}                {(n_1 + n_2)^2 (n_1 + n_2 - 1)}


    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

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *