Introducción al módulo aleatorio de Python

    Introducción

    Incluso para alguien que no esté interesado en la programación de computadoras, la utilidad de generar números al azar en determinadas circunstancias es algo obvio. En la mayoría de los juegos de mesa, tiramos los dados para generar un número impredecible que define el próximo movimiento del jugador. Además, todos podemos estar de acuerdo en que jugar cualquier juego de cartas no tendría sentido sin una mezcla adecuada entre rondas.

    Pero los números aleatorios no solo son importantes en campos relativamente triviales como el entretenimiento o los juegos de azar. Son especialmente cruciales en el campo de la criptografía. Para garantizar la transmisión segura de datos, cada vez que se necesita una conexión segura, se debe generar una clave aleatoria. Muchos tipos diferentes de comunicaciones electrónicas utilizan este tipo de seguridad. Es muy importante que la clave sea difícil de adivinar; la mejor manera de garantizarlo es hacerlo al azar, ya que en el momento en que alguien adivina la clave, puede descifrar el mensaje, y la comunicación ya no es segura.

    Aleatoriedad verdadera frente a pseudoaleatoriedad

    Los números aleatorios se pueden obtener como resultado de la aplicación de métodos llamados generadores de números aleatorios (RNG), que se pueden dividir en dos categorías: verdaderos generadores de números aleatorios (TRNG, también llamados generadores de números aleatorios de hardware) y generadores de números pseudoaleatorios (PRNGS). ).

    Generadores de números aleatorios verdaderos

    Los verdaderos generadores de números aleatorios son métodos que derivan la aleatoriedad, o la imprevisibilidad, de aspectos impredecibles de los procesos físicos. Estos métodos no producen directamente números, sino estados, que luego pueden interpretarse como números; por eso generalmente se les llama generadores de eventos aleatorios (REGs). Algunos de ellos, que utilizan eventos macroscópicos, son comúnmente conocidos: métodos como lanzar dados, lanzar monedas o barajar cartas.

    Estos verdaderos generadores de números aleatorios a menudo utilizan fenómenos físicos más complicados. Algunos de ellos, como la desintegración radiactiva, el ruido térmico o el ruido de radio, derivan su imprevisibilidad de las peculiaridades de la mecánica cuántica. Otros métodos utilizan la imprevisibilidad de ruido atmosférico o incluso el comportamiento de las lámparas de lava.

    Generadores de números pseudoaleatorios

    La verdad es que, muy a menudo, no es necesario generar números que son realmente aleatorios. En muchos casos, todo lo que necesitamos son conjuntos de números que parecen aleatorios. Este tipo de datos se pueden derivar de generadores de números pseudoaleatorios. Estos son algoritmos, que utilizan una pequeña porción de información (llamada semilla) y luego aplican fórmulas matemáticas complicadas para generar conjuntos deterministas de números que se asemejan a conjuntos verdaderamente aleatorios. La semilla puede ser un valor derivado de un verdadero generador de números aleatorios u otra fuente, como el reloj del sistema o la fecha y hora actual.

    La ejecución del generador varias veces con la misma semilla dará como resultado la misma salida cada vez. Los números resultantes son en su mayoría irreconocibles de los números derivados de verdaderos generadores de números aleatorios, aunque en realidad hay algunas regularidades ocultas en su distribución. Aún así, para muchas aplicaciones, este tipo de pseudoaleatoriedad determinista es absolutamente suficiente.

    Módulo aleatorio de Python

    Python, obviamente ofrece un conjunto de herramientas súper fácil de usar para manejar números aleatorios. Un módulo, por alguna razón llamado random, implementa un generador de números pseudoaleatorios y contiene métodos que nos permiten resolver directamente muchos problemas de programación diferentes donde la aleatoriedad entra en juego.

    los random el módulo se basa en Marsenne Twister – un algoritmo muy popular, que es el generador de números pseudoaleatorios predeterminado no solo para Python, sino también para muchos otros sistemas de software populares como Microsoft Excel, MATLAB, R o PHP. Entre sus ventajas importantes se incluyen la concesión de licencias permisivas, la similitud aleatoria confirmada por muchas pruebas estadísticas y una velocidad relativamente alta en comparación con otros PRNG.

    El método random ()

    El método más importante del random módulo es el random() método. La mayoría de las otras funciones dependen de él. los random() El método genera un flotante aleatorio en el rango (0.0, 1.0).

    >>> import random
    >>> random.random()
    0.8474337369372327
    

    El método seed ()

    Si no establecemos una semilla para nuestra generación de números pseudoaleatorios, la semilla predeterminada es la hora actual del sistema. Sin embargo, podemos establecer el valor exacto de la semilla manualmente, lo que es útil, especialmente si queremos replicar nuestros resultados pseudoaleatorios en el futuro. Para ello, podemos utilizar el random.seed() método.

    >>> random.seed(5)
    >>> random.random()
    0.6229016948897019
    >>> random.random()
    0.7417869892607294
    >>> random.random()
    0.7951935655656966
    >>> random.seed(5)
    >>> random.random()
    0.6229016948897019
    

    los random.seed() El método influye en todos los métodos del random módulo que usamos después de llamarlo. En el ejemplo que se muestra arriba, configuramos la semilla a 5 y luego ejecutar el random.random() Funciona varias veces. Es importante tener en cuenta que la semilla definida por el usuario se usa solo la primera vez que otra random se ejecuta el método: después de eso, las semillas de los siguientes métodos se modifican utilizando los valores aleatorios generados anteriormente.

    Esto le permite a Python generar nuevos números cada vez. Pero aún así, después de restablecer la semilla usando el random.seed() método, podemos reproducir exactamente la misma secuencia de números pseudoaleatorios en cualquier momento. Esto es muy útil para cosas como ejecutar pruebas. Si da la misma semilla cada vez que ejecuta una prueba que usa uno de randomde los métodos, entonces aún podrá saber cuál debería ser el resultado de las pruebas.

    Otros ejemplos del módulo aleatorio

    los random.random() El método, que nos da un valor flotante aleatorio de un cierto rango, sería suficiente incluso para que un desarrollador de Python sin experiencia diseñe cualquier tipo de manipulación aleatoria a su alrededor. Probablemente puedas imaginarte lanzando un if o dos para escribir una función que extrae aleatoriamente un valor de una lista o devuelva un entero aleatorio en lugar de un flotante. Bueno el random El módulo también nos permite encargarnos de esas tareas automáticamente. A continuación, muestro un par de métodos interesantes que simplifican las operaciones aleatorias comunes. Puede conocer todo el potencial del random módulo en Documentación oficial de Python.

    >>> random.randint(1,10)
    4
    

    los random.randint() El método toma dos argumentos que describen el rango del cual el método extrae un entero aleatorio.

    >>> random.randrange(2,10,2)
    2
    >>> random.randrange(2,10,2)
    4
    >>> random.randrange(2,10,2)
    8
    >>> random.randrange(2,10,2)
    6
    

    En el guión de arriba, el random.randrange() el método es similar a random.randint() pero también nos permite definir el tercer argumento, que es el punto de paso del rango definido. En el ejemplo anterior, solo requerimos números pares de un rango entre 2 y 10.

    >>> cards = ['ace_spades','10_hearts','3_diamonds','king_hearts']
    >>> random.choice(cards)
    '10_hearts'
    

    En el script anterior, el random.choice() El método elige un elemento aleatorio de una lista.

    >>> cards = ['ace_spades','10_hearts','3_diamonds','king_hearts']
    >>> random.shuffle(cards)
    >>> print(cards)
    ['king_hearts', '3_diamonds', 'ace_spades', '10_hearts']
    

    En el guión anterior, el random.shuffle() El método baraja una lista de elementos. Es importante tener en cuenta que altera la lista en el lugar, lo que significa que devuelve None y de hecho modifica nuestra cards variable.

    Conclusiones

    Obtener buenos números aleatorios, para aplicaciones serias como la criptografía, no es una tarea fácil. Pero cuando un número sólido y pseudoaleatorio es suficiente para nuestra aplicación, Python, como siempre, viene con una serie de formas súper sencillas de alcanzar rápidamente nuestro objetivo.

     

    Rate this post
    Etiquetas:

    Deja una respuesta

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