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)

Wykres rozkładu losowego

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.

Python 3.x 3.6

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


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow