Recherche…


Syntaxe

  • random.seed (a = None, version = 2) (la version est uniquement disponible pour python 3.x)
  • random.getstate ()
  • random.setstate (state)
  • random.randint (a, b)
  • random.randrange (stop)
  • random.randrange (démarrer, arrêter, étape = 1)
  • random.choice (seq)
  • random.shuffle (x, random = random.random)
  • random.sample (population, k)

Aléatoire et séquences: aléatoire, choix et échantillon

import random

mélanger ()

Vous pouvez utiliser random.shuffle() pour mélanger / randomiser les éléments dans une séquence mutable et indexable . Par exemple une 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!

choix()

Prend un élément aléatoire d'une séquence arbitraire:

print(random.choice(laughs))
# Out: He                  # Output may vary!

échantillon()

Comme le choice il prend des éléments aléatoires d'une séquence arbitraire , mais vous pouvez spécifier combien:

#                   |--sequence--|--number--|
print(random.sample(    laughs   ,     1    ))  # Take one element
# Out: ['Ho']                    # Output may vary!

il ne faudra pas deux fois le même élément:

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: Échantillon plus grand que la population

Création d'entiers et de flottants aléatoires: randint, randrange, random et uniform

import random

randint ()

Retourne un entier aléatoire entre x et y (inclus):

random.randint(x, y)

Par exemple obtenir un nombre aléatoire entre 1 et 8 :

random.randint(1, 8) # Out: 8

randrange ()

random.randrange a la même syntaxe que range et contrairement à random.randint , la dernière valeur n'est pas inclusive:

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)

Graphique de distribution aléatoire

au hasard

Renvoie un nombre aléatoire en virgule flottante compris entre 0 et 1:

random.random() # Out: 0.66486093215306317

uniforme

Renvoie un nombre aléatoire en virgule flottante compris entre x et y (inclus):

random.uniform(1, 8) # Out: 3.726062641730108

Nombres aléatoires reproductibles: Semences et état

Définir une graine spécifique créera une série de nombres aléatoires fixes:

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

Réinitialiser la graine créera à nouveau la même séquence "aléatoire":

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

Comme la graine est fixée, ces résultats sont toujours 9 et 4 . Si des nombres spécifiques ne sont pas requis uniquement pour que les valeurs soient les mêmes, vous pouvez également utiliser getstate et setstate pour récupérer un état précédent:

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

Pour pseudo-randomiser la séquence à nouveau, vous seed avec None :

random.seed(None)

Ou appelez la méthode seed sans arguments:

random.seed()

Créer des nombres aléatoires sécurisés par cryptographie

Par défaut, le module aléatoire Python utilise le Mersenne Twister PRNG pour générer des nombres aléatoires qui, bien qu'adaptés à des domaines tels que les simulations, ne répondent pas aux exigences de sécurité dans des environnements plus exigeants.

Pour créer un nombre pseudo-aléatoire sécurisé sur le plan cryptographique, on peut utiliser SystemRandom qui, en utilisant os.urandom , peut agir en tant que générateur de nombres pseudo-aléatoires sécurisés par cryptographie, CPRNG .

La manière la plus simple de l'utiliser consiste simplement à initialiser la classe SystemRandom . Les méthodes fournies sont similaires à celles exportées par le module aléatoire.

from random import SystemRandom
secure_rand_gen = SystemRandom()

Pour créer une séquence aléatoire de 10 int s dans l'intervalle [0, 20] , on peut simplement appeler randrange() :

print([secure_rand_gen.randrange(10) for i in range(10)])
# [9, 6, 9, 2, 2, 3, 8, 0, 9, 9]

Pour créer un entier aléatoire dans une plage donnée, on peut utiliser randint :

print(secure_rand_gen.randint(0, 20))
# 5

et, en conséquence, pour toutes les autres méthodes. L'interface est exactement la même, le seul changement est le générateur de nombres sous-jacent.

Vous pouvez également utiliser os.urandom directement pour obtenir des octets aléatoires sécurisés par cryptographie.

Création d'un mot de passe utilisateur aléatoire

Afin de créer un mot de passe utilisateur aléatoire, nous pouvons utiliser les symboles fournis dans le module de string . Spécifiquement la punctuation pour les punctuation de ponctuation, les lettres ascii_letters pour les lettres et les digits pour les chiffres:

from string import punctuation, ascii_letters, digits

Nous pouvons alors combiner tous ces symboles dans un nom nommé symbols :

symbols = ascii_letters + digits + punctuation

Supprimez l'un de ces éléments pour créer un pool de symboles contenant moins d'éléments.

Après cela, nous pouvons utiliser random.SystemRandom pour générer un mot de passe. Pour un mot de passe de longueur 10:

secure_random = random.SystemRandom()
password = "".join(secure_random.choice(symbols) for i in range(10))
print(password)  # '^@g;J?]M6e'

Notez que les autres routines immédiatement disponibles par le module random - telles que random.choice , random.randint , etc. - ne conviennent pas à des fins de cryptographie.

Derrière les rideaux, ces routines utilisent le Mersenne Twister PRNG , qui ne répond pas aux exigences d'un CSPRNG . Ainsi, en particulier, vous ne devez en utiliser aucun pour générer des mots de passe que vous prévoyez d'utiliser. Utilisez toujours une instance de SystemRandom comme indiqué ci-dessus.

Python 3.x 3.6

À partir de Python 3.6, le module secrets est disponible, ce qui expose des fonctionnalités sécurisées sur le plan cryptographique.

En citant la documentation officielle , pour générer "un mot de passe alphanumérique de dix caractères avec au moins un caractère minuscule, au moins une majuscule et au moins trois chiffres", vous pouvez:

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

Décision binaire aléatoire

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
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow