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)

Diagramm der zufälligen Verteilung

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.

Python 3.x 3.6

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


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow