Ricerca…


Sintassi

  • random.seed (a = None, version = 2) (la versione è disponibile solo per python 3.x)
  • random.getstate ()
  • random.setstate (stato)
  • random.randint (a, b)
  • random.randrange (stop)
  • random.randrange (start, stop, step = 1)
  • random.choice (ss)
  • random.shuffle (x, random = random.random)
  • random.sample (popolazione, k)

Casuale e sequenze: shuffle, scelta e campione

import random

Shuffle ()

Puoi usare random.shuffle() per mescolare / randomizzare gli elementi in una sequenza mutabile e indicizzabile . Ad esempio un 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!

scelta()

Prende un elemento casuale da una sequenza arbitrale:

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

campione()

Come choice prende elementi casuali da una sequenza arbitrale ma puoi specificare quanti:

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

non prenderà lo stesso elemento due volte:

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: campione più grande della popolazione

Creazione di numeri interi e float casuali: randint, randrange, random e uniform

import random

randInt ()

Restituisce un intero casuale tra x ed y (compreso):

random.randint(x, y)

Ad esempio ottenendo un numero casuale compreso tra 1 e 8 :

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

randrange ()

random.randrange ha la stessa sintassi range e diversamente da random.randint , l'ultimo valore non è compreso:

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)

Grafico di distribuzione casuale

casuale

Restituisce un numero a virgola mobile casuale compreso tra 0 e 1:

random.random() # Out: 0.66486093215306317

uniforme

Restituisce un numero decimale casuale tra x ed y (compreso):

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

Numeri casuali riproducibili: seme e stato

L'impostazione di un seme specifico creerà una serie di numeri casuali fissi:

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

La reimpostazione del seme creerà nuovamente la stessa sequenza "casuale":

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

Poiché il seme è fisso, questi risultati sono sempre 9 e 4 . Se non è necessario avere numeri specifici, solo che i valori saranno gli stessi, è possibile utilizzare semplicemente getstate e setstate per ripristinare uno stato precedente:

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

Per pseudo-randomizzare nuovamente la sequenza, fai il seed con None :

random.seed(None)

Oppure chiama il metodo seed senza argomenti:

random.seed()

Crea numeri casuali crittograficamente sicuri

Di default il modulo random Python usa il MNSEN Twister PRNG per generare numeri casuali, che, sebbene adatti in domini come le simulazioni, non riescono a soddisfare i requisiti di sicurezza in ambienti più esigenti.

Per creare un numero pseudocasuale crittograficamente sicuro, si può usare SystemRandom che, usando os.urandom , è in grado di agire come un generatore di numeri pseudocasuali crittograficamente sicuro, CPRNG .

Il modo più semplice per usarlo consiste semplicemente SystemRandom classe SystemRandom . I metodi forniti sono simili a quelli esportati dal modulo casuale.

from random import SystemRandom
secure_rand_gen = SystemRandom()

Per creare una sequenza casuale di 10 int nell'intervallo [0, 20] , è sufficiente chiamare randrange() :

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

Per creare un numero intero casuale in un determinato intervallo, è possibile utilizzare randint :

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

e, di conseguenza, per tutti gli altri metodi. L'interfaccia è esattamente la stessa, l'unica modifica è il generatore di numeri sottostante.

Puoi anche utilizzare os.urandom direttamente per ottenere byte casuali crittograficamente sicuri.

Creazione di una password utente casuale

Per creare una password utente casuale, possiamo usare i simboli forniti nel modulo string . Precisamente punctuation per i simboli di punteggiatura, ascii_letters per lettere e digits per cifre:

from string import punctuation, ascii_letters, digits

Possiamo quindi combinare tutti questi simboli in un nome chiamato symbols :

symbols = ascii_letters + digits + punctuation

Rimuovere uno di questi per creare un pool di simboli con meno elementi.

Dopo questo, possiamo usare random.SystemRandom per generare una password. Per una password di 10 lunghezze:

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

Nota che altre routine rese immediatamente disponibili dal modulo random - come random.choice , random.randint , ecc. - non sono adatte per scopi crittografici.

Dietro le quinte, queste routine utilizzano il Mersenne Twister PRNG , che non soddisfa i requisiti di un CSPRNG . Quindi, in particolare, non dovresti usarne nessuna per generare password che intendi utilizzare. Usa sempre un'istanza di SystemRandom come mostrato sopra.

Python 3.x 3.6

A partire da Python 3.6, è disponibile il modulo dei secrets , che espone funzionalità crittograficamente sicure.

Citando la documentazione ufficiale , per generare "una password alfanumerica di dieci caratteri con almeno un carattere minuscolo, almeno un carattere maiuscolo e almeno tre cifre", potresti:

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

Decisione binaria casuale

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
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow