Python Language
Modulo casuale
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)
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.
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")