Python Language
Zufälliges Modul
Suche…
Syntax
- random.seed (a = None, Version = 2) (Version ist nur für Python 3.x verfügbar)
- random.getstate ()
- random.setstate (state)
- zufällig.randint (a, b)
- random.randrange (stop)
- Random.randrange (Start, Stop, Schritt = 1)
- random.choice (seq)
- random.shuffle (x, random = random.random)
- random.sample (bevölkerung, k)
Zufall und Sequenzen: Mischen, Auswahl und Probe
import random
Mischen()
Sie können random.shuffle()
, um die Elemente in einer veränderbaren und indizierbaren Sequenz zu mischen bzw. zu randomisieren. Zum Beispiel eine 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!
Wahl()
Nimmt ein zufälliges Element aus einer beliebigen Reihenfolge :
print(random.choice(laughs))
# Out: He # Output may vary!
Probe()
Wie bei der choice
zufällige Elemente aus einer beliebigen Reihenfolge übernommen, aber Sie können angeben, wie viele
# |--sequence--|--number--|
print(random.sample( laughs , 1 )) # Take one element
# Out: ['Ho'] # Output may vary!
Es wird nicht zweimal dasselbe Element verwendet:
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: Stichprobe größer als Grundgesamtheit
Erstellen von zufälligen Ganzzahlen und Floats: Randint, Randrange, Random und Uniform
import random
randint ()
Gibt eine zufällige ganze Zahl zwischen x
und y
(einschließlich) zurück:
random.randint(x, y)
Zum Beispiel eine Zufallszahl zwischen 1
und 8
:
random.randint(1, 8) # Out: 8
randrange ()
random.randrange
hat dieselbe Syntax wie range
und anders als random.randint
ist der letzte Wert nicht inklusive:
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)
zufällig
Gibt eine zufällige Gleitkommazahl zwischen 0 und 1 zurück:
random.random() # Out: 0.66486093215306317
Uniform
Gibt eine zufällige Gleitkommazahl zwischen x
und y
(einschließlich) zurück:
random.uniform(1, 8) # Out: 3.726062641730108
Reproduzierbare Zufallszahlen: Samen und Zustand
Durch das Festlegen eines bestimmten Seed wird eine feste Zufallszahlenreihe erstellt:
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
Durch das Zurücksetzen des Seed wird die gleiche "zufällige" Sequenz erneut erstellt:
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
Da der Samen fest ist, sind diese Ergebnisse immer 9
und 4
. Wenn es nicht erforderlich ist, bestimmte Zahlen zu verwenden, nur dass die Werte gleich sind, können Sie auch getstate
und setstate
, um den vorherigen Zustand wiederherzustellen:
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
Um die Sequenz erneut pseudozufällig zu machen, seed
Sie mit None
:
random.seed(None)
Oder rufen Sie die seed
Methode ohne Argumente auf:
random.seed()
Erstellen Sie kryptografisch sichere Zufallszahlen
Das Python-Zufallsmodul verwendet standardmäßig das Mersenne Twister PRNG
, um Zufallszahlen zu generieren, die zwar in Domänen wie Simulationen geeignet sind, aber den Sicherheitsanforderungen in anspruchsvolleren Umgebungen nicht genügen.
Um eine kryptographisch sichere Pseudozufallszahl zu erstellen, kann SystemRandom
das mit os.urandom
als kryptografisch sicherer Pseudozufallszahlengenerator ( CPRNG) fungieren kann .
Der einfachste Weg zur Verwendung besteht darin, die SystemRandom
Klasse zu initialisieren. Die zur Verfügung gestellten Methoden ähneln denen, die vom Zufallsmodul exportiert werden.
from random import SystemRandom
secure_rand_gen = SystemRandom()
Um eine zufällige Sequenz von 10 int
s im Bereich [0, 20]
zu erstellen, können Sie einfach randrange()
aufrufen:
print([secure_rand_gen.randrange(10) for i in range(10)])
# [9, 6, 9, 2, 2, 3, 8, 0, 9, 9]
Um eine zufällige Ganzzahl in einem bestimmten Bereich zu erstellen, können Sie randint
:
print(secure_rand_gen.randint(0, 20))
# 5
und entsprechend für alle anderen Methoden. Die Schnittstelle ist exakt gleich, die einzige Änderung ist der zugrunde liegende Zahlengenerator.
Sie können os.urandom
direkt verwenden, um kryptografisch sichere Zufallsbytes zu erhalten.
Ein zufälliges Benutzerpasswort erstellen
Um ein zufälliges Benutzerpasswort zu erstellen, können wir die im string
Modul enthaltenen Symbole verwenden. Speziell punctuation
für Interpunktionssymbole, ascii_letters
für Buchstaben und digits
für Ziffern:
from string import punctuation, ascii_letters, digits
Wir können dann alle diese Symbole in einem Namen namens symbols
kombinieren:
symbols = ascii_letters + digits + punctuation
Entfernen Sie eines dieser Elemente, um einen Pool von Symbolen mit weniger Elementen zu erstellen.
Danach können wir random.SystemRandom
, um ein Passwort zu generieren. Für ein 10 langes Passwort:
secure_random = random.SystemRandom()
password = "".join(secure_random.choice(symbols) for i in range(10))
print(password) # '^@g;J?]M6e'
Beachten Sie, dass andere Routinen gemacht sofort verfügbar durch das random
Modul - wie random.choice
, random.randint
usw. - sind ungeeignet für kryptographische Zwecke.
Hinter diesen Vorhängen verwenden diese Routinen den Mersenne Twister PRNG , der die Anforderungen eines CSPRNG nicht erfüllt. Daher sollten Sie insbesondere keines davon verwenden, um Passwörter zu generieren, die Sie verwenden möchten. Verwenden Sie immer eine Instanz von SystemRandom
wie oben gezeigt.
Ab Python 3.6 steht das secrets
Modul zur Verfügung, das kryptographisch sichere Funktionen bietet.
Zitieren Sie die offizielle Dokumentation , um "ein zehnstelliges alphanumerisches Passwort mit mindestens einem Kleinbuchstaben, mindestens einem Großbuchstaben und mindestens drei Ziffern" zu generieren.
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
Zufällige binäre Entscheidung
import random
probability = 0.3
if random.random() < probability:
print("Decision with probability 0.3")
else:
print("Decision with probability 0.7")