set.seed() und Reproduzierbarkeit
Stellen Sie mit set.seed() sicher, dass die Erzeugung von Zufallszahlen über mehrere Durchläufe hinweg reproduzierbar ist
set.seed() und Reproduzierbarkeit ist eine kostenlose R Academy-Lektion auf CoddyKit. Dies ist Lektion 1 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des R Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der R Academy-Kurs umfasst insgesamt 4 Lektionen.
Warum Reproduzierbarkeit wichtig ist
Die Erzeugung von Zufallszahlen ist pseudozufällig: Sie beruht auf einem deterministischen Algorithmus, der durch einen Startwert initialisiert wird. Das Setzen des Startwerts macht Ihre Simulationen reproduzierbar — derselbe Code erzeugt stets dieselben Ergebnisse. Das ist für Fehlersuche, Veröffentlichungen und Lehre unerlässlich.
# Without set.seed: different every run
runif(3) # e.g., 0.21, 0.57, 0.89 (changes each run)
runif(3) # different again!
# With set.seed: always identical
set.seed(42)
runif(3) # always: 0.9148060 0.9370754 0.2861395
set.seed(42) # reset seed
runif(3) # exactly the same three numbers again
cat('set.seed() is your reproducibility guarantee')Funktionsweise von set.seed()
set.seed(n) initialisiert den Zustand des Zufallszahlengenerators (RNG). Jede positive ganze Zahl ist zulässig. Der Startwert bestimmt die gesamte folgende Folge von Zufallszahlen, bis der Startwert zurückgesetzt wird. Verwenden Sie für Reproduzierbarkeit eine feste Zahl.
# Different seeds give different sequences
set.seed(1)
seq1 <- rnorm(5)
set.seed(99)
seq2 <- rnorm(5)
print(seq1)
print(seq2)
identical(seq1, seq2) # FALSE
# Same seed always gives same sequence
set.seed(1)
seq1_again <- rnorm(5)
identical(seq1, seq1_again) # TRUE
# Common seed choices
set.seed(123) # popular convention
set.seed(2024) # use year for temporal clarityRNGkind(): RNG-Algorithmus
RNGkind() zeigt den RNG-Algorithmus an oder legt ihn fest. R verwendet standardmäßig Mersenne-Twister mit der Methode Inversion für die Normalverteilung. Der Algorithmus beeinflusst die Folge. Dokumentieren Sie daher für vollständige Reproduzierbarkeit sowohl den Startwert als auch RNGkind.
# Check current RNG settings
RNGkind()
# [1] 'Mersenne-Twister' 'Inversion' 'Rejection'
# [1] kind, normal.kind, sample.kind
# Set explicitly for maximum reproducibility
RNGkind('Mersenne-Twister', 'Inversion', 'Rejection')
set.seed(42)
runif(3)
# Alternative RNG algorithms (rarely needed)
# RNGkind('L'Ecuyer-CMRG') # for parallel RNG
# RNGkind('Super-Duper') # older algorithm
cat('Default Mersenne-Twister has period 2^19937 - 1').Random.seed untersuchen
.Random.seed ist ein globaler Ganzzahlvektor, der den vollständigen RNG-Zustand speichert. Er wird nach jeder Zufallsziehung automatisch aktualisiert. Sie können ihn speichern und wiederherstellen, um eine Folge ab einem beliebigen Punkt erneut abzuspielen.
set.seed(42)
# .Random.seed is created in .GlobalEnv after first use
length(.Random.seed) # 626 integers for Mersenne-Twister
.Random.seed[1] # encodes RNG type
# Generate one number (state advances)
x1 <- runif(1)
state_after <- .Random.seed
# Generate another
x2 <- runif(1)
# Restore state to after x1
.Random.seed <<- state_after
x2_replay <- runif(1)
identical(x2, x2_replay) # TRUE - we replayed the state
cat('x2:', x2, 'x2_replay:', x2_replay)RNG-Zustand speichern und wiederherstellen
Speichern Sie den RNG-Zustand vor einem Codeblock und stellen Sie ihn später wieder her, um diesen Block exakt erneut abzuspielen. Das ist flexibler als set.seed(), wenn Sie eine Folge in der Mitte fortsetzen müssen.
set.seed(100)
# Generate some random numbers first
runif(10)
# Save current state
saved_state <- .Random.seed
# Generate block of interest
block1 <- rnorm(5)
print(block1)
# ... later, restore and replay
.Random.seed <<- saved_state
block1_replay <- rnorm(5)
identical(block1, block1_replay) # TRUE!
cat('RNG state saved and restored successfully')Parallele RNG-Erzeugung mit L'Ecuyer-CMRG
Bei der Verwendung von Parallel Computing benötigt jeder Prozess einen unabhängigen RNG-Datenstrom. Der Generator L'Ecuyer-CMRG stellt lange, nicht überlappende Datenströme für parallele Worker bereit und gewährleistet so unabhängige Ergebnisse über die einzelnen Kerne hinweg.
# Set up L'Ecuyer-CMRG for parallel use
RNGkind('L\'Ecuyer-CMRG')
set.seed(42)
# Each parallel worker gets its own stream
# (parallel package handles this automatically)
# library(parallel)
# cl <- makeCluster(4)
# clusterSetRNGStream(cl, iseed = 42)
# Generate numbers with this generator
samples <- rnorm(5)
print(samples)
# Reset to default Mersenne-Twister
RNGkind('Mersenne-Twister', 'Inversion', 'Rejection')
cat('L\'Ecuyer-CMRG: safe for parallel simulation')Seed in Funktionsaufrufen
Das Setzen eines Seeds innerhalb einer Funktion beeinflusst den RNG-Zustand des Aufrufers nach der Rückkehr aus der Funktion nicht – denn der Seed-Aufruf der Funktion ändert den globalen Wert von .Random.seed. Legen Sie die Seed-Verwaltung in wiederverwendbaren Funktionen ausdrücklich fest.
# Function that optionally accepts a seed
simulate_data <- function(n, seed = NULL) {
if (!is.null(seed)) set.seed(seed)
list(
x = rnorm(n),
y = rnorm(n)
)
}
# Reproducible call
result1 <- simulate_data(5, seed = 42)
result2 <- simulate_data(5, seed = 42)
identical(result1$x, result2$x) # TRUE
# Without seed: different each time
result3 <- simulate_data(5)
result4 <- simulate_data(5)
identical(result3$x, result4$x) # FALSEReproduzierbares Sampling
Das Argument sample.kind von RNGkind() wirkt sich speziell auf sample() aus. Seit R 3.6.0 lautet der Standardwert für eine bessere Gleichverteilung 'Rejection' – verwenden Sie diesen Wert in reproduzierbaren Workflows.
# R 3.6+ default sample kind
RNGkind(sample.kind = 'Rejection') # default
set.seed(42)
sample(1:10, 5)
# [1] 1 5 10 8 2 (with Rejection)
# Old behavior (R < 3.6) for legacy code
RNGkind(sample.kind = 'Rounding')
set.seed(42)
sample(1:10, 5)
# Different result!
# Best practice: reset to modern defaults
RNGkind('Mersenne-Twister', 'Inversion', 'Rejection')
set.seed(42)
sample(1:10, 5)Zufallszahlen dokumentieren
Bewährte Vorgehensweise für reproduzierbare Forschung: Dokumentieren Sie Ihre R-Version, den Seed-Wert und RNGkind. Verwenden Sie sessionInfo(), um die vollständige Umgebung zu erfassen. Halten Sie Seeds in Skriptkommentaren oder einer Konfigurationsdatei fest.
# Reproducibility header for analysis scripts:
# R version: R.version$version.string
# Seed: 42
# RNGkind: Mersenne-Twister / Inversion / Rejection
# Capture R version
R.version$version.string
# Capture full session info
# sessionInfo() # shows all packages and versions
# In RMarkdown, set seed in setup chunk:
# ```{r setup}
# knitr::opts_chunk$set(echo = TRUE)
# set.seed(42)
# ```
# This ensures all chunks share the same RNG state
set.seed(42)
cat('R version:', R.version$version.string, '\n')
cat('Seed: 42, RNGkind: Mersenne-Twister')Seeds in Monte-Carlo-Studien
Verwenden Sie in umfangreichen Simulationsstudien einen einzelnen Master-Seed, um Seeds für die einzelnen Replikationen zu erzeugen. Dadurch lässt sich jede Replikation einzeln reproduzieren, während das Gesamtdesign deterministisch bleibt.
# Generate per-replicate seeds from a master seed
set.seed(2024)
n_replicates <- 5
replicate_seeds <- sample.int(1e6, n_replicates)
print(replicate_seeds)
# Each replicate uses its own seed
run_replicate <- function(rep_id) {
set.seed(replicate_seeds[rep_id])
mean(rnorm(1000)) # estimate with this seed
}
results <- sapply(seq_len(n_replicates), run_replicate)
print(round(results, 4))
# Any single replicate can be re-run independently:
set.seed(replicate_seeds[3])
mean(rnorm(1000)) # exactly matches results[3]Zufallszahlen mit withr testen
Das Paket withr stellt with_seed(seed, expr) bereit. Die Funktion setzt vorübergehend einen Seed, wertet den Ausdruck aus und stellt anschließend den ursprünglichen RNG-Zustand wieder her – ideal für Tests, ohne den globalen Zustand zu verändern.
# withr::with_seed - restore RNG state automatically
# library(withr)
# result <- with_seed(42, rnorm(5))
# Simulation without withr (manual state save)
old_seed <- if (exists('.Random.seed')) .Random.seed
old_kind <- RNGkind()
set.seed(42)
result <- rnorm(5)
# Restore
if (!is.null(old_seed)) .Random.seed <<- old_seed
cat('Result:', result, '\n')
cat('Caller\'s RNG state preserved')
# set.seed in tests ensures deterministic assertions:
set.seed(1)
stopifnot(round(rnorm(1), 6) == round(-0.6264538, 6))Kurze Überprüfung
Testen Sie Ihr Verständnis der Reproduzierbarkeit von RNG in R.
Zusammenfassung: Seed und Reproduzierbarkeit
Die wichtigsten Punkte: set.seed(n) macht Code mit Zufallszahlen reproduzierbar. RNGkind() zeigt den Algorithmus an bzw. legt ihn fest – dokumentieren Sie sowohl den Seed als auch den Typ. .Random.seed speichert den vollständigen RNG-Zustand und kann gespeichert bzw. wiederhergestellt werden. Verwenden Sie für Parallel Computing L'Ecuyer-CMRG. Akzeptieren Sie in Funktionen einen Parameter seed. Verwenden Sie bei umfangreichen Simulationen Seeds pro Replikation, die aus einem Master-Seed erzeugt wurden.
# Reproducibility checklist:
# 1. Set seed at script top
set.seed(42)
# 2. Document RNGkind
RNGkind() # Mersenne-Twister / Inversion / Rejection
# 3. Save RNG state if needed
saved <- .Random.seed
# 4. For functions, accept seed argument
my_sim <- function(n, seed = NULL) {
if (!is.null(seed)) set.seed(seed)
rnorm(n)
}
# 5. For parallel: use L'Ecuyer-CMRG
# RNGkind('L\'Ecuyer-CMRG'); set.seed(42)
cat('Reproducibility = trust in your results')Lerne R mit einem KI-Tutor — kostenlos
Schreibe und führe echten Code in deinem Browser aus, bekomme sofortige Hilfe von einem 24/7 KI-Tutor und setze dein Lernen im Web oder in der App fort.
- Kurse
- 43
- Lektionen
- 159
Häufig gestellte Fragen
Ist die Lektion „set.seed() und Reproduzierbarkeit“ kostenlos?
Ja — der vollständige Text von „set.seed() und Reproduzierbarkeit“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des R Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der R Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „set.seed() und Reproduzierbarkeit“?
Stellen Sie mit set.seed() sicher, dass die Erzeugung von Zufallszahlen über mehrere Durchläufe hinweg reproduzierbar ist Du übst R Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um R Academy zu starten?
Keine Vorkenntnisse erforderlich. R Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 1 von 4.
Wie lange dauert die Lektion „set.seed() und Reproduzierbarkeit“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser R Academy-Lektion Code schreiben und ausführen?
Ja. Jede R Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- set.seed() und Reproduzierbarkeit
- Erzeugen von Zufallsverteilungen
- Grundlagen der Monte-Carlo-Simulation
- Bootstrap-Resampling in R