Python Language
Módulo aleatorio
Buscar..
Sintaxis
- random.seed (a = Ninguna, versión = 2) (la versión solo está disponible para Python 3.x)
- random.getstate ()
- random.setstate (estado)
- random.randint (a, b)
- random.randrange (detener)
- random.randrange (inicio, parada, paso = 1)
- elección aleatoria
- random.shuffle (x, random = random.random)
- muestra aleatoria (población, k)
Aleatorio y secuencias: barajar, selección y muestra.
import random
barajar()
Puede usar random.shuffle()
para mezclar / aleatorizar los elementos en una secuencia mutable e indexable . Por ejemplo una list
:
laughs = ["Hi", "Ho", "He"]
random.shuffle(laughs) # Shuffles in-place! Don't do: laughs = random.shuffle(laughs)
print(laughs)
# Out: ["He", "Hi", "Ho"] # Output may vary!
elección()
Toma un elemento aleatorio de una secuencia arbitraria:
print(random.choice(laughs))
# Out: He # Output may vary!
muestra()
Como choice
, toma elementos aleatorios de una secuencia arbitraria , pero puedes especificar cuántos:
# |--sequence--|--number--|
print(random.sample( laughs , 1 )) # Take one element
# Out: ['Ho'] # Output may vary!
no tomará el mismo elemento dos veces:
print(random.sample(laughs, 3)) # Take 3 random element from the sequence.
# Out: ['Ho', 'He', 'Hi'] # Output may vary!
print(random.sample(laughs, 4)) # Take 4 random element from the 3-item sequence.
ValueError: Muestra más grande que la población
Creación de enteros y flotadores aleatorios: randint, randrange, random y uniform
import random
randint ()
Devuelve un entero aleatorio entre x
y y
(inclusive):
random.randint(x, y)
Por ejemplo obteniendo un número aleatorio entre 1
y 8
:
random.randint(1, 8) # Out: 8
randrange ()
random.randrange
tiene la misma sintaxis que range
y, a diferencia de random.randint
, el último valor no es inclusivo:
random.randrange(100) # Random integer between 0 and 99
random.randrange(20, 50) # Random integer between 20 and 49
random.rangrange(10, 20, 3) # Random integer between 10 and 19 with step 3 (10, 13, 16 and 19)
aleatorio
Devuelve un número de punto flotante aleatorio entre 0 y 1:
random.random() # Out: 0.66486093215306317
uniforme
Devuelve un número de punto flotante aleatorio entre x
y y
(inclusive):
random.uniform(1, 8) # Out: 3.726062641730108
Números aleatorios reproducibles: semilla y estado
Establecer una semilla específica creará una serie fija de números aleatorios:
random.seed(5) # Create a fixed state
print(random.randrange(0, 10)) # Get a random integer between 0 and 9
# Out: 9
print(random.randrange(0, 10))
# Out: 4
Restablecer la semilla creará la misma secuencia "aleatoria" de nuevo:
random.seed(5) # Reset the random module to the same fixed state.
print(random.randrange(0, 10))
# Out: 9
print(random.randrange(0, 10))
# Out: 4
Dado que la semilla está fija, estos resultados son siempre 9
y 4
. Si no es necesario tener números específicos solo que los valores serán los mismos, también puede usar getstate
y setstate
para recuperar un estado anterior:
save_state = random.getstate() # Get the current state
print(random.randrange(0, 10))
# Out: 5
print(random.randrange(0, 10))
# Out: 8
random.setstate(save_state) # Reset to saved state
print(random.randrange(0, 10))
# Out: 5
print(random.randrange(0, 10))
# Out: 8
Para pseudoaleatorizar de nuevo la secuencia, se seed
con None
:
random.seed(None)
O llame al método seed
sin argumentos:
random.seed()
Crear números aleatorios criptográficamente seguros
Por defecto, el módulo aleatorio de Python usa el PRNG
Mersenne Twister para generar números aleatorios que, aunque son adecuados en dominios como simulaciones, no cumplen con los requisitos de seguridad en entornos más exigentes.
Para crear un número pseudoaleatorio seguro criptográficamente, se puede usar SystemRandom
que, mediante el uso de os.urandom
, puede actuar como un generador de número pseudoaleatorio seguro criptográficamente, CPRNG .
La forma más fácil de usarlo consiste simplemente en inicializar la clase SystemRandom
. Los métodos proporcionados son similares a los exportados por el módulo aleatorio.
from random import SystemRandom
secure_rand_gen = SystemRandom()
Para crear una secuencia aleatoria de 10 int
s en el rango [0, 20]
, simplemente se puede llamar a randrange()
:
print([secure_rand_gen.randrange(10) for i in range(10)])
# [9, 6, 9, 2, 2, 3, 8, 0, 9, 9]
Para crear un entero aleatorio en un rango dado, uno puede usar randint
:
print(secure_rand_gen.randint(0, 20))
# 5
y, en consecuencia para todos los demás métodos. La interfaz es exactamente la misma, el único cambio es el generador de números subyacente.
También puede usar os.urandom
directamente para obtener bytes aleatorios criptográficamente seguros.
Creando una contraseña de usuario aleatoria
Para crear una contraseña de usuario aleatoria, podemos utilizar los símbolos proporcionados en el módulo de string
. Específicamente punctuation
para los símbolos de puntuación, ascii_letters
para las cartas y digits
para dígitos:
from string import punctuation, ascii_letters, digits
Luego podemos combinar todos estos símbolos en un nombre llamado symbols
:
symbols = ascii_letters + digits + punctuation
Elimine cualquiera de estos para crear un conjunto de símbolos con menos elementos.
Después de esto, podemos usar random.SystemRandom
para generar una contraseña. Para una contraseña de 10 longitudes:
secure_random = random.SystemRandom()
password = "".join(secure_random.choice(symbols) for i in range(10))
print(password) # '^@g;J?]M6e'
Tenga en cuenta que otras rutinas puestos a disposición de inmediato por el random
módulo - como random.choice
, random.randint
, etc. - no son adecuados para los propósitos criptográficos.
Detrás de las cortinas, estas rutinas utilizan el PRNG de Mersenne Twister , que no satisface los requisitos de un CSPRNG . Por lo tanto, en particular, no debe usar ninguno de ellos para generar contraseñas que planea usar. Siempre use una instancia de SystemRandom
como se muestra arriba.
A partir de Python 3.6, el módulo de secrets
está disponible, lo que expone la funcionalidad criptográficamente segura.
Al citar la documentación oficial , para generar "una contraseña alfanumérica de diez caracteres con al menos un carácter en minúscula, al menos un carácter en mayúscula y al menos tres dígitos" , podría:
import string
alphabet = string.ascii_letters + string.digits
while True:
password = ''.join(choice(alphabet) for i in range(10))
if (any(c.islower() for c in password)
and any(c.isupper() for c in password)
and sum(c.isdigit() for c in password) >= 3):
break
Decisión Binaria Aleatoria
import random
probability = 0.3
if random.random() < probability:
print("Decision with probability 0.3")
else:
print("Decision with probability 0.7")