set.seed() en reproduceerbaarheid
Zorg met set.seed() voor reproduceerbare generatie van willekeurige getallen bij meerdere uitvoeringen.
set.seed() en reproduceerbaarheid is een gratis R Academy-les op CoddyKit. Dit is les 1 van 4. Je kunt 3 lessen uit dit leerpad gratis volledig lezen — daarna ontgrendelt CoddyKit PRO alle lessen, plus praktische oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject R Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus R Academy bevat in totaal 4 lessen.
Waarom reproduceerbaarheid belangrijk is
Het genereren van willekeurige getallen is pseudo-willekeurig: een deterministisch algoritme dat wordt geïnitialiseerd met een startwaarde. Door de seed in te stellen, maak je simulaties reproduceerbaar: dezelfde code levert altijd dezelfde resultaten op. Dat is essentieel voor foutopsporing, publicaties en onderwijs.
# 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')Werking van set.seed()
set.seed(n) initialiseert de toestand van de generator voor willekeurige getallen (RNG). Elk positief geheel getal werkt. De seed bepaalt de volledige toekomstige reeks willekeurige getallen totdat de seed opnieuw wordt ingesteld. Gebruik een vast getal voor reproduceerbaarheid.
# 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-algoritme
RNGkind() toont of stelt het RNG-algoritme in. De standaardinstelling van R is Mersenne-Twister met Inversion als methode voor de normale verdeling. Het algoritme beïnvloedt de reeks, dus leg zowel de seed als RNGkind vast voor volledige reproduceerbaarheid.
# 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 bekijken
.Random.seed is een globale gehele-getallenvector waarin de volledige RNG-toestand wordt opgeslagen. Deze wordt na elke trekking automatisch bijgewerkt. Je kunt de vector opslaan en herstellen om een reeks vanaf elk punt opnieuw af te spelen.
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)De RNG-toestand opslaan en herstellen
Sla de RNG-toestand op voordat je een codeblok uitvoert en herstel deze later om dat blok exact opnieuw af te spelen. Dit is flexibeler dan set.seed() wanneer je halverwege een reeks wilt doorgaan.
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')Parallelle RNG met L'Ecuyer-CMRG
Bij parallel rekenen heeft elk proces een onafhankelijke RNG-stroom nodig. De generator L'Ecuyer-CMRG levert lange, niet-overlappende stromen voor parallelle werkers, zodat de resultaten op verschillende kernen onafhankelijk blijven.
# 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 functieaanroepen
Als je binnen een functie een seed instelt, heeft dat na het terugkeren van de functie geen invloed op de RNG-status van de aanroeper — omdat de seed-aanroep van de functie de globale .Random.seed wijzigt. Wees expliciet over seed-beheer in herbruikbare functies.
# 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) # FALSEReproduceerbare steekproeven
Het argument sample.kind van RNGkind() heeft specifiek invloed op sample(). Sinds R 3.6.0 is de standaard gewijzigd in 'Rejection' voor een betere uniformiteit — gebruik dit in reproduceerbare werkstromen.
# 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)Willekeur documenteren
Een goede gewoonte voor reproduceerbaar onderzoek: documenteer je R-versie, seed-waarde en RNGkind. Gebruik sessionInfo() om de volledige omgeving vast te leggen. Noteer seeds in opmerkingen in scripts of in een configuratiebestand.
# 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-onderzoeken
Gebruik in grote simulatieonderzoeken één master-seed om seeds per replicatie te genereren. Zo is elke replicatie afzonderlijk reproduceerbaar, terwijl het volledige ontwerp deterministisch blijft.
# 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]Willekeur testen met withr
Het pakket withr biedt with_seed(seed, expr), waarmee tijdelijk een seed wordt ingesteld, de expressie wordt geëvalueerd en daarna de oorspronkelijke RNG-status wordt hersteld — ideaal voor tests zonder de globale status te vervuilen.
# 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))Korte controle
Test je begrip van reproduceerbaarheid van RNG in R.
Samenvatting: seed en reproduceerbaarheid
Belangrijkste punten: set.seed(n) maakt code met willekeur reproduceerbaar. RNGkind() toont of stelt het algoritme in — documenteer zowel de seed als het type. .Random.seed bevat de volledige RNG-status en kan worden opgeslagen en hersteld. Gebruik voor parallel rekenen L'Ecuyer-CMRG. Laat functies een seed-parameter accepteren. Gebruik in grote simulaties seeds per replicatie die vanuit een master-seed zijn gegenereerd.
# 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')Leer R met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 43
- Lessen
- 159
Veelgestelde vragen
Is de les “set.seed() en reproduceerbaarheid” gratis?
Ja — je kunt hier op het web alle 3 lessen van het leerpad R Academy, waaronder “set.seed() en reproduceerbaarheid”, gratis volledig lezen. Daarna ontgrendelt CoddyKit PRO alle lessen, plus interactieve oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. De cursus R Academy bevat in totaal 4 lessen.
Wat leer ik in “set.seed() en reproduceerbaarheid”?
Zorg met set.seed() voor reproduceerbare generatie van willekeurige getallen bij meerdere uitvoeringen. Je oefent met R Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met R Academy te beginnen?
Ervaring vooraf is niet nodig. R Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 1 van 4.
Hoe lang duurt de les “set.seed() en reproduceerbaarheid”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over R Academy?
Ja. Elke les over R Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- set.seed() en reproduceerbaarheid
- Willekeurige verdelingen genereren
- Basisprincipes van Monte-Carlosimulatie
- Bootstrapherschikking in R