Skip to content

Python Random: Zufallszahlen, Auswahlen und Stichproben generieren

Updated on

Das Generieren von Zufallsdaten ist grundlegend für die Programmierung -- vom Mischen einer Playlist und der Stichprobenauswahl von Umfrageteilnehmern bis hin zu Monte-Carlo-Simulationen und der Erstellung von Testdatensätzen. Aber Pythons random-Modul hat Dutzende von Funktionen, und es ist leicht, die falsche zu verwenden. random.random() aufzurufen, wenn man eine Ganzzahl braucht, choice() zu verwenden, wenn man mehrere eindeutige Elemente braucht, oder zu vergessen, dass random nicht kryptographisch sicher ist, kann zu subtilen Fehlern oder Sicherheitslücken führen.

Pythons random-Modul bietet ein umfassendes Toolkit für die Pseudo-Zufallszahlengenerierung. Diese Anleitung behandelt jede Funktion, die Sie häufig benötigen, mit klaren Beispielen, wann Sie welche verwenden sollten.

📚

Zufällige Ganzzahlen

randint(a, b)

Gibt eine zufällige Ganzzahl N zurück, sodass a <= N <= b (beide Endpunkte eingeschlossen).

import random
 
# Random integer between 1 and 10 (inclusive)
print(random.randint(1, 10))  # e.g., 7
 
# Simulate a dice roll
dice = random.randint(1, 6)
print(f"You rolled a {dice}")
 
# Generate random ages for test data
ages = [random.randint(18, 65) for _ in range(5)]
print(ages)  # e.g., [34, 52, 21, 45, 28]

randrange(start, stop, step)

Wie range(), gibt aber ein zufälliges Element zurück. Der Stop-Wert ist ausgeschlossen.

import random
 
# Random even number between 0 and 100
print(random.randrange(0, 101, 2))  # e.g., 42
 
# Random number from 0 to 9
print(random.randrange(10))  # e.g., 7
 
# Random multiple of 5 from 0 to 100
print(random.randrange(0, 101, 5))  # e.g., 35

Zufällige Gleitkommazahlen

random()

Gibt eine zufällige Gleitkommazahl im Bereich [0.0, 1.0) zurück.

import random
 
print(random.random())  # e.g., 0.7234...
 
# Scale to any range: random float between 10 and 20
value = 10 + random.random() * 10
print(value)  # e.g., 15.23...

uniform(a, b)

Gibt eine zufällige Gleitkommazahl N zurück, sodass a <= N <= b.

import random
 
# Random temperature between 98.0 and 99.5
temp = random.uniform(98.0, 99.5)
print(f"Temperature: {temp:.1f}F")  # e.g., Temperature: 98.7F
 
# Random price between 9.99 and 29.99
price = round(random.uniform(9.99, 29.99), 2)
print(f"Price: ${price}")

gauss(mu, sigma) -- Normalverteilung

import random
 
# Generate normally distributed values (mean=100, std=15)
iq_scores = [round(random.gauss(100, 15)) for _ in range(10)]
print(iq_scores)  # e.g., [112, 95, 103, 88, 107, ...]

Zufällige Auswahlen

choice(seq)

Gibt ein einzelnes zufälliges Element aus einer nicht-leeren Sequenz zurück.

import random
 
colors = ['red', 'blue', 'green', 'yellow', 'purple']
print(random.choice(colors))  # e.g., 'green'
 
# Random character from a string
print(random.choice('abcdefghij'))  # e.g., 'f'

choices(population, weights, k)

Gibt eine Liste von k Elementen zurück, die MIT Zurücklegen ausgewählt werden (Duplikate möglich). Unterstützt Gewichtungen.

import random
 
# Pick 5 random colors (duplicates allowed)
colors = ['red', 'blue', 'green']
print(random.choices(colors, k=5))  # e.g., ['blue', 'red', 'blue', 'green', 'red']
 
# Weighted selection (red is 5x more likely)
weighted = random.choices(
    ['red', 'blue', 'green'],
    weights=[5, 1, 1],
    k=10
)
print(weighted)  # Mostly 'red'

sample(population, k)

Gibt k eindeutige Elemente zurück, die OHNE Zurücklegen ausgewählt werden (keine Duplikate).

import random
 
# Lottery numbers: 6 unique numbers from 1-49
lottery = random.sample(range(1, 50), 6)
print(sorted(lottery))  # e.g., [3, 12, 27, 33, 41, 48]
 
# Random survey sample
employees = ['Alice', 'Bob', 'Charlie', 'Diana', 'Eve', 'Frank']
survey_group = random.sample(employees, 3)
print(survey_group)  # e.g., ['Diana', 'Alice', 'Frank']

choice vs choices vs sample

FunktionZurücklegenRückgabeAnwendungsfall
choice(seq)N/A (einzelnes Element)Ein ElementEin zufälliges Element auswählen
choices(pop, k=n)Mit ZurücklegenListe von n ElementenGewichtete Zufallsauswahl, Simulationen
sample(pop, k=n)Ohne ZurücklegenListe von n eindeutigen ElementenLotterie, zufällige Teilmengen

Mischen

shuffle(seq)

Mischt eine Liste an Ort und Stelle. Gibt None zurück.

import random
 
deck = list(range(1, 53))  # 52 cards
random.shuffle(deck)
print(deck[:5])  # e.g., [37, 12, 48, 3, 21]
 
# Deal 5 cards
hand = deck[:5]
remaining = deck[5:]

Seeds und Reproduzierbarkeit

Das Setzen eines Seeds macht die Zufallsausgabe reproduzierbar -- entscheidend für Tests und Debugging.

import random
 
random.seed(42)
print(random.randint(1, 100))  # Always 81
print(random.random())          # Always 0.0744...
 
# Reset seed for same sequence
random.seed(42)
print(random.randint(1, 100))  # 81 again
print(random.random())          # 0.0744... again

Wann Seeds verwenden

SzenarioSeed?Warum
Unit-TestsJaReproduzierbare Testergebnisse
DebuggingJaDen genauen Fehler reproduzieren
Simulationen (Analyse)JaReproduzierbare Experimente
Spiele (Gameplay)NeinSpieler erwarten echten Zufall
Sicherheit/KryptoNein (nutze secrets)Seeds machen die Ausgabe vorhersagbar

Testdaten generieren

import random
import string
 
def random_string(length=10):
    """Generate a random alphanumeric string."""
    chars = string.ascii_letters + string.digits
    return ''.join(random.choices(chars, k=length))
 
def random_email():
    """Generate a random email address."""
    name = random_string(8).lower()
    domains = ['gmail.com', 'yahoo.com', 'outlook.com']
    return f"{name}@{random.choice(domains)}"
 
def random_user():
    """Generate a random user record."""
    first_names = ['Alice', 'Bob', 'Charlie', 'Diana', 'Eve']
    last_names = ['Smith', 'Jones', 'Brown', 'Wilson', 'Taylor']
    return {
        'name': f"{random.choice(first_names)} {random.choice(last_names)}",
        'email': random_email(),
        'age': random.randint(18, 65),
        'score': round(random.uniform(0, 100), 1),
    }
 
# Generate 5 test users
users = [random_user() for _ in range(5)]
for user in users:
    print(user)

Random und Data Science

Für Datenanalyse-Workflows hilft das random-Modul bei Stichprobennahme, Bootstrapping und der Erstellung synthetischer Datensätze. In Kombination mit pandas können Sie schnell Test-DataFrames generieren:

import random
import pandas as pd
 
random.seed(42)
n = 1000
 
df = pd.DataFrame({
    'age': [random.randint(18, 80) for _ in range(n)],
    'income': [round(random.gauss(50000, 15000), 2) for _ in range(n)],
    'category': random.choices(['A', 'B', 'C'], weights=[5, 3, 2], k=n),
})
print(df.describe())

Für die interaktive Exploration Ihrer Zufallsdatensätze verwandelt PyGWalker (opens in a new tab) jeden pandas DataFrame in eine Tableau-ähnliche Visualisierungs-UI direkt in Jupyter:

import pygwalker as pyg
walker = pyg.walk(df)

Sicherheitswarnung: random vs secrets

Das random-Modul ist NICHT für Sicherheitszwecke geeignet. Seine Ausgabe ist deterministisch und vorhersagbar, wenn der Seed bekannt ist. Für Passwörter, Tokens und kryptographische Anwendungen verwenden Sie das secrets-Modul:

import secrets
 
# Cryptographically secure random token
token = secrets.token_hex(16)
print(token)  # e.g., 'a3f2b8c9d1e4f5a6b7c8d9e0f1a2b3c4'
 
# Secure random integer
secure_int = secrets.randbelow(100)
 
# Secure random choice
secure_choice = secrets.choice(['option1', 'option2', 'option3'])
Eigenschaftrandomsecrets
AlgorithmusMersenne Twister (PRNG)OS-Entropiequelle (CSPRNG)
DeterministischJa (mit Seed)Nein
GeschwindigkeitSchnellLangsamer
Verwenden fürSimulationen, Spiele, TestsPasswörter, Tokens, Krypto
ReproduzierbarJa (mit seed())Nein

FAQ

Wie generiere ich eine zufällige Ganzzahl in Python?

Verwenden Sie random.randint(a, b), um eine zufällige Ganzzahl zwischen a und b (einschließlich) zu erhalten. Zum Beispiel gibt random.randint(1, 10) eine Zahl von 1 bis 10 zurück. Für einen Bereich, der die obere Grenze ausschließt, verwenden Sie random.randrange(start, stop).

Was ist der Unterschied zwischen random.choice und random.sample?

random.choice(seq) gibt ein einzelnes zufälliges Element zurück. random.sample(population, k) gibt k eindeutige Elemente ohne Zurücklegen zurück. Um mehrere Elemente auszuwählen, bei denen Duplikate erlaubt sind, verwenden Sie random.choices(population, k=n).

Wie mache ich Zufallsergebnisse reproduzierbar?

Rufen Sie random.seed(value) auf, bevor Sie Zufallszahlen generieren. Die Verwendung desselben Seeds erzeugt jedes Mal die gleiche Folge von Zufallswerten. Dies ist essenziell für Unit-Tests und Debugging.

Ist Pythons random-Modul sicher?

Nein. Das random-Modul verwendet den Mersenne-Twister-Algorithmus, der deterministisch und vorhersagbar ist. Für sicherheitsrelevante Anwendungen wie Passwörter oder Tokens verwenden Sie stattdessen das secrets-Modul, das kryptographisch sichere Zufallsquellen nutzt.

Wie mische ich eine Liste zufällig in Python?

Verwenden Sie random.shuffle(my_list), um eine Liste an Ort und Stelle zu mischen. Es ändert die ursprüngliche Liste und gibt None zurück. Wenn Sie die Originalliste unverändert benötigen, erstellen Sie zuerst eine Kopie: shuffled = my_list.copy(); random.shuffle(shuffled).

Fazit

Pythons random-Modul deckt jeden gängigen Bedarf an Zufallsgenerierung ab: randint für Ganzzahlen, uniform für Gleitkommazahlen, choice/choices/sample für die Auswahl aus Sequenzen, shuffle zum Mischen und seed für Reproduzierbarkeit. Merken Sie sich den wichtigen Unterschied: choices erlaubt Duplikate (mit Zurücklegen), sample nicht (ohne Zurücklegen). Und verwenden Sie random niemals für Sicherheit -- nutzen Sie stattdessen secrets.

📚