Python Language
Moduł losowy
Szukaj…
Składnia
- random.seed (a = Brak, wersja = 2) (wersja jest dostępna tylko dla Pythona 3.x)
- random.getstate ()
- random.setstate (stan)
- random.randint (a, b)
- random.randrange (stop)
- random.randrange (start, stop, step = 1)
- random.choice (seq)
- random.shuffle (x, random = random.random)
- random.sample (populacja, k)
Losowość i sekwencje: losowanie, wybór i próbka
import random
człapać()
Możesz użyć random.shuffle()
aby wymieszać / randomizować elementy w sekwencji, którą można random.shuffle()
i indeksować . Na przykład 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!
wybór()
Pobiera losowy element z dowolnej sekwencji :
print(random.choice(laughs))
# Out: He # Output may vary!
próba()
Podobnie jak choice
, pobiera losowe elementy z dowolnej sekwencji, ale możesz określić, ile:
# |--sequence--|--number--|
print(random.sample( laughs , 1 )) # Take one element
# Out: ['Ho'] # Output may vary!
nie zajmie dwa razy tego samego elementu:
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: Próbka większa niż populacja
Tworzenie losowych liczb całkowitych i liczb zmiennoprzecinkowych: randint, randrange, random i uniform
import random
randint ()
Zwraca losową liczbę całkowitą od x
do y
(włącznie):
random.randint(x, y)
Na przykład uzyskanie losowej liczby od 1
do 8
:
random.randint(1, 8) # Out: 8
randrange ()
random.randrange
ma tę samą składnię co range
i w przeciwieństwie do random.randint
, ostatnia wartość nie obejmuje:
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)
losowy
Zwraca losową liczbę zmiennoprzecinkową z zakresu od 0 do 1:
random.random() # Out: 0.66486093215306317
mundur
Zwraca losową liczbę zmiennoprzecinkową między x
i y
(włącznie):
random.uniform(1, 8) # Out: 3.726062641730108
Odtwarzalne liczby losowe: ziarno i stan
Ustawienie określonego Ziarna spowoduje utworzenie stałej serii liczb losowych:
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
Zresetowanie nasion spowoduje ponowne utworzenie tej samej „losowej” sekwencji:
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
Ponieważ ziarno jest ustalone, wyniki te wynoszą zawsze 9
i 4
. Jeśli posiadanie określonych liczb nie jest wymagane, aby wartości były takie same, można również użyć getstate
i setstate
aby przywrócić poprzedni stan:
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
Aby ponownie pseudolosowo powtórzyć sekwencję, seed
pomocą None
:
random.seed(None)
Lub wywołaj metodę seed
bez argumentów:
random.seed()
Twórz bezpieczne losowo liczby kryptograficzne
Domyślnie losowy moduł Python używa Mersenne Twister PRNG
do generowania liczb losowych, które, choć odpowiednie w domenach takich jak symulacje, nie spełniają wymagań bezpieczeństwa w bardziej wymagających środowiskach.
Aby utworzyć kryptograficznie bezpieczny numer pseudolosowy, można użyć SystemRandom
który za pomocą os.urandom
może działać jako kryptograficznie bezpieczny generator liczb pseudolosowych CPRNG .
Najłatwiejszym sposobem użycia jest po prostu zainicjowanie klasy SystemRandom
. Podane metody są podobne do metod eksportowanych przez moduł losowy.
from random import SystemRandom
secure_rand_gen = SystemRandom()
Aby utworzyć losową sekwencję 10 int
w zakresie [0, 20]
, wystarczy po prostu wywołać randrange()
:
print([secure_rand_gen.randrange(10) for i in range(10)])
# [9, 6, 9, 2, 2, 3, 8, 0, 9, 9]
Aby utworzyć losową liczbę całkowitą w danym zakresie, można użyć randint
:
print(secure_rand_gen.randint(0, 20))
# 5
i odpowiednio dla wszystkich innych metod. Interfejs jest dokładnie taki sam, jedyną zmianą jest podstawowy generator liczb.
Możesz także użyć os.urandom
bezpośrednio, aby uzyskać kryptograficznie bezpieczne losowe bajty.
Tworzenie losowego hasła użytkownika
Aby utworzyć losowe hasło użytkownika, możemy użyć symboli podanych w module string
. W szczególności punctuation
dla symboli interpunkcyjnych, ascii_letters
dla liter i digits
dla cyfr:
from string import punctuation, ascii_letters, digits
Następnie możemy połączyć wszystkie te symbole w nazwę o nazwie symbols
:
symbols = ascii_letters + digits + punctuation
Usuń jeden z nich, aby utworzyć pulę symboli z mniejszą liczbą elementów.
Następnie możemy użyć random.SystemRandom
do wygenerowania hasła. W przypadku hasła o długości 10:
secure_random = random.SystemRandom()
password = "".join(secure_random.choice(symbols) for i in range(10))
print(password) # '^@g;J?]M6e'
Pamiętaj, że inne procedury udostępnione natychmiast przez moduł random
- takie jak random.choice
, random.randint
itp. - są nieodpowiednie do celów kryptograficznych.
Za zasłonami te procedury wykorzystują Mersenne Twister PRNG , który nie spełnia wymagań CSPRNG . Dlatego w szczególności nie należy używać żadnego z nich do generowania haseł, których planujesz użyć. Zawsze używaj wystąpienia SystemRandom
jak pokazano powyżej.
Począwszy od Pythona 3.6, dostępny jest moduł secrets
, który udostępnia bezpieczeństwo kryptograficzne.
Cytując oficjalną dokumentację , aby wygenerować „dziesięcioznakowe hasło alfanumeryczne z co najmniej jedną małą literą, co najmniej jedną wielką literą i co najmniej trzema cyframi”, możesz:
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
Losowa decyzja binarna
import random
probability = 0.3
if random.random() < probability:
print("Decision with probability 0.3")
else:
print("Decision with probability 0.7")