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)

Gráfico de distribución aleatoria

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.

Python 3.x 3.6

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")


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow