La aleatoriedad está a nuestro alrededor. Cuando lanzas una moneda o tiras un dado, nunca puedes estar seguro del resultado final. Esta imprevisibilidad tiene muchas aplicaciones como determinar los ganadores de un sorteo afortunado o generar casos de prueba para un experimento con valores aleatorios producidos en base a un algoritmo.
Teniendo en cuenta esta utilidad, Python nos ha proporcionado el módulo aleatorio. Puedes usarlo en juegos para generar enemigos al azar o para barajar los elementos en una lista.
Casi todas las funciones de este módulo dependen de las funciones básicas. aleatorio()
función, que generará un flotador aleatorio mayor o igual a cero y menor que uno. Python usa el Mersenne Twister para generar los flotadores. Produce flotadores de precisión de 53 bits con un período de 2 ** 19937-1. En realidad, es el generador de números pseudoaleatorios de uso general más utilizado..
A veces, desea que el generador de números aleatorios reproduzca la secuencia de números que creó la primera vez. Esto se puede lograr proporcionando el mismo valor de semilla ambas veces al generador usando el semilla (s, version)
función. Si el parametro s se omite, el generador utilizará la hora actual del sistema para generar los números. Aquí hay un ejemplo:
importar random random.seed (100) random.random () # devuelve 0.1456692551041303 random.random () # devuelve 0.45492700451402135
Tenga en cuenta que, a diferencia de un lanzamiento de moneda, el módulo genera números pseudoaleatorios que son completamente deterministas, por lo que no es adecuado para fines criptográficos..
El módulo tiene dos funciones diferentes para generar enteros aleatorios. Puedes usar randrange (a)
para generar un número entero al azar menor que una
.
Del mismo modo, puede utilizar randrange (a, b [, paso])
para generar un número aleatorio de rango (a, b, paso)
. Por ejemplo, usando random.randrange (0, 100, 3)
solo devolverá aquellos números entre 0 y 100 que también son divisibles por 3.
Si conoce el límite inferior y superior entre los que desea generar los números, puede utilizar una función más simple e intuitiva llamada randint (a, b)
. Es simplemente un alias para randrange (a, b + 1)
.
import random random.randrange (100) # devuelve 65 random.randrange (100) # devuelve 98 random.randrange (0, 100, 3) # devuelve 33 random.randrange (0, 100, 3) # devuelve 75 random.randint ( 1,6) # devuelve 4 random.randint (1,6) # devuelve 6
Para seleccionar un elemento aleatorio de una secuencia no vacía dada, puede usar la elección (seq)
función. Con randint ()
, está limitado a una selección de números de un rango determinado. los elección (seq)
La función le permite elegir un número de cualquier secuencia que desee.
Otra cosa buena acerca de esta función es que no se limita solo a los números. Puede seleccionar cualquier tipo de elemento al azar de una secuencia. Por ejemplo, el nombre del ganador de un sorteo entre cinco personas diferentes, proporcionado como una cadena, se puede determinar usando esta función fácilmente.
Si desea barajar una secuencia en lugar de seleccionar un elemento aleatorio de ella, puede usar la barajar
función. Esto resultará en una en su lugar barajando la secuencia. Para una secuencia con solo 10 (n) elementos, puede haber un total de 3628800 (n!) Arreglos diferentes. Con una secuencia mayor, el número de permutaciones posibles será aún mayor; esto implica que la función nunca puede generar todas las permutaciones de una secuencia grande.
Digamos que tienes que elegir a 50 estudiantes de un grupo de 100 estudiantes para ir de viaje.
En este punto, puede ser tentado utilizar el elección (seq)
función. El problema es que tendrá que llamarlo aproximadamente 50 veces en el mejor de los casos en que no vuelva a elegir al mismo estudiante..
Una mejor solución es utilizar el muestra (seq, k)
función. Se devolverá una lista de k Elementos únicos de la secuencia dada. La secuencia original se mantiene sin cambios. Los elementos en la lista resultante estarán en orden de selección. Si k es mayor que el número de elementos en la secuencia misma, se generará un ValueError.
importar identificadores aleatorios = [1, 8, 10, 12, 15, 17, 25] random.choice (ids) # devuelve 8 random.choice (ids) # devuelve 15 nombres = ['Tom', 'Harry', 'Andrew ',' Robert '] random.choice (nombres) # devuelve Tom random.choice (nombres) # devuelve Robert random.shuffle (nombres) nombres # devuelve [' Robert ',' Andrew ',' Tom ',' Harry '] random.sample (nombres, 2) # devuelve ['Andrew', 'Robert'] random.sample (nombres, 2) # devuelve ['Tom', 'Robert'] nombres # devuelve ['Robert', 'Andrew', 'Tom', 'Harry']
Como puedes ver, barajar
modificó la lista original, pero muestra (seq, k)
lo mantuvo intacto.
En esta sección, aprenderá sobre las funciones que se pueden usar para generar números aleatorios basados en distribuciones de valor real específicas. Los parámetros de la mayoría de estas funciones llevan el nombre de la variable correspondiente en la ecuación real de esa distribución.
Cuando solo quiere un número entre 0 y 1, puede usar el aleatorio()
función. Si desea que el número esté en un rango específico, puede usar el uniforme (a, b)
funcionar con una y segundo como los límites inferior y superior respectivamente.
Digamos que necesitas generar un número aleatorio entre bajo y alto de tal manera que tenga una mayor probabilidad de estar cerca de otro número modo. Puedes hacer esto con el triangular (bajo, alto, modo)
función. los bajo y alto Los valores serán 0 y 1 por defecto. Del mismo modo, el modo el valor predeterminado es el punto medio del valor bajo y alto, lo que resulta en una distribución simétrica.
Hay muchas otras funciones para generar números aleatorios basados en diferentes distribuciones. Como ejemplo, puedes usar normalvariate (mu, sigma)
para generar un número aleatorio basado en una distribución normal, con mu como media y sigma como desviación estándar.
import random random.random () # devuelve 0.8053547502449923 random.random () # devuelve 0.05966180559620815 random.uniform (1, 20) # devuelve 11.970525425108205 random.uniform (1, 20) # return 7.731292430291898 random.triangular (1, 100, 80) # devuelve 42.328674062298816 random.triangular (1, 100, 80) # devuelve 73.54693076132074
Como acabamos de ver, es posible generar números aleatorios con una distribución uniforme, así como una distribución triangular o normal. Incluso en un rango finito de 0 a 100, hay un número infinito de flotadores que se pueden generar. ¿Qué sucede si hay un conjunto finito de elementos y desea agregar más peso a algunos valores específicos al seleccionar un número aleatorio? Esta situación es común en los sistemas de lotería donde los números con poca recompensa reciben una alta ponderación.
Si es aceptable que su aplicación tenga pesos que sean valores enteros, puede crear una lista de elementos cuya frecuencia depende de su peso. A continuación, puede utilizar el elección (seq)
Función para seleccionar un elemento de esta lista ponderada al azar. Aquí hay un ejemplo que muestra la selección de una cantidad de premio al azar.
importar al azar w_prizes = [('$ 1', 300), ('$ 2', 50), ('$ 10', 5), ('$ 100', 1)] prize_list = [premio por premio, peso en w_prizes para i en rango (peso)] random.choice (prize_list) # devuelve '$ 1'
En mi caso, se necesitaron diez intentos para obtener un premio de $ 2 elegido de la lista. Las posibilidades de obtener un premio de $ 100 serían mucho menores. Del mismo modo, también puede agregar sesgo a otros programas similares.
Este módulo puede ser útil en muchas situaciones, como mezclar las preguntas en una asignación o generar nombres de usuario o contraseñas aleatorias para sus usuarios mediante el uso de barajar()
función. También puede generar números aleatorios de manera uniforme, así como dar ponderación a los números en un rango específico. En nuestro próximo tutorial, usaremos las funciones de este módulo para generar datos aleatorios para el análisis estadístico.
¿Tienes en mente algunas aplicaciones interesantes de generadores de números aleatorios que pueden ser útiles para otros lectores? Háganos saber en los comentarios..