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.

     

    Etiquetas:

    Deja una respuesta

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