Lerne Coding
Zufällige Zahlen generieren in Python mit dem Random Modul
04.09.2022

Zufälle in Python nutzen, mit dem Random und Secrets Modul

Inhaltsverzeichnis
[[TABLE OF CONTENTS]]
access_timeGeschätzte Lesezeit ca. Minuten

Du willst ein Spielprogrammieren, ein Passwort-Generator oder ein Token für eine API. Für alle diese Fälle benötigst du entweder das Python-Modul random oder secrets.

Mittels diesen Python-Codes erhältst du eine zufällige Zahl zwischen 0 und 1 aus diesem Wert können durch entsprechende mathematische Formeln alle zufälligen Zahlen erzeugt werden, die benötigt werden.

import random 

random.random() # Ausgabe zum Beispiel: 0.25730674307725243

Was du lernen wirst, in diesem Artikel über Zufallszahlen in Python:

  • Eine zufällige Zahl generieren
  • Eine kryptografisch starke Zufallszahl erzeugen
  • Aus einer Liste ein Element zufällig auswählen
  • Einen Passwort-Generator mit den Methoden des random Moduls erstellen.

Als Erstes beginnen wir mit dem Random Modul, dieses stellt uns eine Vielzahl von Möglichkeiten bereit zufällige Zahlen zu erhalten, sowohl Floats als auch Integers. Zusätzlich gibt es auch Methoden, um direkt zufällige Elemente einer Liste zu erhalten. Das Random Modul arbeitet mit einem Pseudo Random Number Generator (PRNG) alternativ dazu gibt es noch das Secrets Modul, das wiederum arbeitet mit einem Cryptographically Strong Pseudo Random Number Generator (CSPRNG). Auf die Unterschiede gehen wir noch einmal weiter unten im Detail ein, behalte diese aber schon einmal im Hinterkopf. Beide Module sowohl Random als auch Secrets sind Build-In Module von Python und benötigen keine extra Installation mittels pip.

Falls du dich eher für Java interessierst, schau doch mal in den Artikel: Zufällige Zahlen in Java generieren mit der Random Klasse

Zufallszahlen in einem definierten Intervall erhalten

Du benötigst eine Zahl zwischen 0 und 10, kein Problem mit der Methode randrange(), mit dieser kannst du eine zufällige Zahl in einem Bereich erhalten. Du kannst entweder nur einen Parameter angeben oder zwei, falls du einen Startwert als Erstes definieren willst, oder auch drei, wenn du noch den Abstand definieren willst.

import random

random.randrange(10) # mögliche Rückgaben: 0,1,2,3,4,5,6,7,8,9

random.randrange(2,10) # mögliche Rückgaben: 2,3,4,5,6,7,8,9

random.randrange(0,10,2) # mögliche Rückgaben: 0,2,4,6,8

Zu beachten ist, dass hier der Stopp wert exkludiert wird und nicht möglich ist aufzutauchen in der Ausgabe. Als Alternative genauer gesagt als Alias gibt es die Methode randint(a,b) diese erwartet immer ein Start und Stopp wert, wobei das ganze Aufgelöst wird mit randrange(a, b+1) also nur eine Vereinfachung.

Diese könnt unter anderem folgendermaßen verwendet werden für einen Sechsseitige Würfel.

random.randint(1,6) # mögliche Rückgaben: 1,2,3,4,5,6

Zufällige Zahlen mit Kommastellen erhalten (Float)

Wenn du Float Zahlen benötigst, kannst du die random() oder uniform() Methode verwenden.

Die random() Methode gibt dir eine Gleitkommazahl zwischen 0 und 1 zurück. Bei der uniform() Methode kannst du wieder ein Start und Stopp wert definieren. Wichtig der Stopp wert ist exklusive nicht inklusive.

random.random() # mögliche Rückgabe: 0.29755288514631273

Bei der uniform() Methode gibt es keine Möglichkeit abstände zu definieren wie bei der randrange() Methode.

random.uniform(0,100) # mögliche Rückgabe: 77.72188442827222

Random – mit Python Listen arbeiten

Nachdem wir nun einige Möglichkeiten kennengelernt haben für das Arbeiten mit Zahlen, schauen wir uns noch einmal das Arbeiten mit Listen an. Den hier stellt das Random Modul auch ein paar hilfreiche Methoden zur Verfügung wie Shuffle, Choices oder Choice. Ja, du hast recht, es geht jetzt nicht direkt um Zufallszahlen, allerdings basiert in jeder Programmiersprache auch das Erstellen von zufälligen Listen auf Zahlen im Hintergrund. So könntest du aus dem bisherigen Wissen die drei Methoden, die ich dir hier vorstelle, ohne Probleme nachprogrammieren.

Mit der shuffel() Methode kann man eine Sequenz von Elementen durch Würfeln. Es wird keine neue Liste von dieser Methode zurückgegeben, sondern die bestehende Variable wird überschrieben, mit der angepassten Liste.

import random

fahrzeugTypen = ["Auto","Laster","Motorrad","Transporter","Flugzeug","Hubschrauber","Rakete"]

random.shuffle(fahrzeugTypen)

print(fahrzeugTypen) # Ausgabe zum Beispiel: ['Rakete', 'Laster', 'Auto', ...]

Mit der choice() Methode kann man ein zufälliges Element von einer Liste erhalten, bezogen auf die Fahrzeugtypen aus dem vorherigen Beispiel könnten wir den String Flugzeug erhalten.

print(random.choice(fahrzeugTypen)) 
# Ausgabe zum Beispiel: Laster

Alternative dazu gibt es noch die Methode choices() diese kann eine Liste von K-Elementen Zurückgeben. So könnte man sich etwa eine Liste von drei Fahrzeugtypen zurückgeben lassen.

print(random.choices(fahrzeugTypen,k = 3)) 
# Ausgabe zum Beispiel: ['Hubschrauber', 'Motorrad', 'Rakete']

Warum ist der Zufall nicht zufällig?

Nachdem wir nun die Random Methode kennengelernt haben, möchte ich noch einmal auf CSPRNG und PRNG zusprechen kommen. Den bisher haben wir keinen Zufall kennengelernt, sondern nur Pseudo Zufallszahlen, den alle Varianten arbeiten mit einem Pseudo Random Number Generator. Diese kommt daher, dass im Hintergrund eine mathematische Funktion die Zahlen berechnet und dafür meistens nur die Systemzeit einbezieht, die natürlich vorausgesagt werden kann. Also ist es möglich die Zufallszahlen vorher zusagen, bei Kryptografisch kritischen Anwendungen ist diese natürlich nicht zielführende. Dafür gibt es in Python das Modul Secrets, welches mit einem CSPRNG arbeitet, dieser ist kryptografisch sicherer, allerdings sind das noch keine echten Zufallszahlen. Also falls du Tokens und Passwörter generieren willst, bist du mit dem SystemRandom() auf der sicheren Seite.

💡 Beachte ein echter Zufall kann nur durch physikalische Werte wie atmosphärischen Rauschen oder atomaren Zerfall sicher erstellt werden, diese ist aber in den wenigsten Anwendungen notwendig. Und die Methoden, die wir mit dem Secrets Modul zur Verfügung haben, sind für die meisten Anwendungen ausreichende. Anwendungen, die zum Beispiel hier sehr sicher aufgebaut sein müssen, sind Banktokens, wenn diese anhand der Systemzeit vorhergesagt werden könnten, das wäre fatal.

Kryptografisch sichere Zufallszahlen in Python erhalten

Das Secrets Modul stellt über einen SecureRandom Generator eine Implementierung von den Methoden des Random Moduls bereit. Mit der Variable secretsGenerator können nun wieder alle Methoden aus dem vorherigen Beispiel verwendet werden. Der Unterschied ist jetzt, dass als Basis das os.urandom(x) verwendet wird, dieses bezieht mehrere Systemwerte eine, um den PRNG sicherer zu machen, um einen CSPRNG zu erhalten.

Random Methoden verwenden in einem CSPRNG

Die SystemRandom() Methode ist nicht nur im Modul Secrets vorhanden, sondern auch im Random Module, die Implementierung ist gleich. Der Unterschied ist hier nur, dass im Secrets Module noch weitere Methoden für die Erstellung von Tokens enthalten sind.

import secrets

randomSecrets = secrets.SystemRandom() 

Sichere Tokens Generieren

Zum Beispiel, um einen Token zu erstellen, der an eine URL übergeben werden kann, genauer gesagt aus ASCII-Zeichen besteht, kann die Methode token_urlsafe() verwendet werden.

secrets.token_urlsafe(32) # Ausgabe: m00jwMiiXQzJqnFlk338xEn3ugFb2K-xW5KZViZ2u34

Selbige Methode gibt es noch einmal als: token_hex(),token_bytes() ansonsten verhalten sich diese wieder ähnlich bis auf die Ausgabe als Hex Wert oder als Bytes.

Zufällige sichere Zahlen generieren

Zusätzlich zu den Methoden der Random Methode gibt es noch die Methode randbelow(), mit dieser können ebenfalls zufällige Zahlen Generierte werden. Es gibt nur einen Parameter, dieser muss gesetzt werden und ein Stopp wert sein.

secrets.randbelow(0,10) # Ausgabe: 0,1,2,3,4,5,6,7,8,9

Beispielprogramm – Passwort-Generator

Nun können wir einmal unser gelerntes Wissen anhand eines Passwort-Generators anwenden, als Erstes definieren, wir uns eine Variable chars dieser enthält alle Zeichen, die wir verwenden dürfen.

Als Zweites erstellen wir uns mit der SystemRandom() Methode ein CSPRNG, den wir verwenden können, um jetzt in jeder Iteration ein Zeichen aus der Variable Chars auszuwählen. Vorher definieren wir uns noch eine Variable length, um die Länge für unser Passwort zu definieren. Mit der choice() Methode, die wir bereits für Listen kennengelernt habe, können wir jetzt ein zufälliges Zeichen für unser Passwort erhalten.

import random
import string

chars = string.ascii_letters + string.digits + string.punctuation
systemRandom = random.SystemRandom() 
password = ""
length = 32

for _ in range(length):
    password += systemRandom.choice(chars)

print(password)

Aufgabe: Wenn du dieses Beispiel jetzt verstanden hast, versuche doch mal das ganze mit der choices() Methode zu machen, den so kannst du dir den Loop Sparen, schaffst du das?

Und so einfach kannst du in Python einen sicheren Passwort-Generator erstellen!

Zusammenfassung

Das Python-Modul random und das Modul secrets stellen verschiedene Funktionen zur Verfügung, um zufällige Zahlen und Elemente aus Listen zu generieren. Beide Module sind Teil von Python und müssen nicht extra installiert werden. Das random-Modul arbeitet mit einem Pseudo Random Number Generator (PRNG) und das secrets-Modul mit einem Cryptographically Strong Pseudo Random Number Generator (CSPRNG). Die Methoden randrange und randint erlauben es, zufällige Zahlen innerhalb eines festgelegten Bereichs zu generieren, während die Methode choice zufällige Elemente aus einer Liste auswählt. Mit den Funktionen des random-Moduls kann auch ein Passwort-Generator erstellt werden. Wenn die Sicherheit des generierten Wertes von großer Bedeutung ist, sollte die SystemRandom()-Methode verwendet werden, die stärkere Zufallszahlen für kryptografische Anwendungen generiert.

Bildquelle - Vielen Dank an die Ersteller:innen für dieses Bild
Kommentare zum Artikel

Es sind noch keine Kommentare vorhanden? Sei der/die Erste und verfasse einen Kommentar zum Artikel "Zufällige Zahlen generieren in Python mit dem Random Modul"!

Kommentar schreiben

Vom Autor Empfohlen
close