R Academy · Lektion

set.seed() og reproducerbarhed

Sørg for reproducerbar generering af tilfældige tal på tværs af kørsler med set.seed().

Lektion 1 af 413 trin

set.seed() og reproducerbarhed er en gratis R Academy-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i R Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. R Academy-kurset indeholder 4 lektioner i alt.

Hvorfor reproducerbarhed er vigtig

Generering af tilfældige tal er pseudo-tilfældig: en deterministisk algoritme, der initialiseres med en startværdi. Når du angiver frøet, bliver dine simuleringer reproducerbare — den samme kode giver altid de samme resultater, hvilket er vigtigt ved fejlfinding, publicering og undervisning.

# 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')

Mekanikken bag set.seed()

set.seed(n) initialiserer tilstand for generatoren af tilfældige tal (RNG). Alle positive heltal kan bruges. Frøet bestemmer hele den efterfølgende sekvens af tilfældige tal, indtil frøet nulstilles. Brug et fast tal for at sikre reproducerbarhed.

# 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 clarity

RNGkind(): RNG-algoritmen

RNGkind() viser eller angiver RNG-algoritmen. R's standard er Mersenne-Twister med metoden Inversion til normalfordelingen. Algoritmen påvirker sekvensen, så dokumentér både frøet og RNGkind for fuld reproducerbarhed.

# 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')

Undersøgelse af .Random.seed

.Random.seed er en global heltalsvektor, der gemmer hele RNG-tilstanden. Den opdateres automatisk efter hver generering af et tilfældigt tal. Du kan gemme og gendanne den for at afspille en sekvens igen fra et hvilket som helst punkt.

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)

Lagring og gendannelse af RNG-tilstanden

Gem RNG-tilstanden før en kodeblok, og gendan den senere for at afspille blokken nøjagtigt igen. Det er mere fleksibelt end set.seed(), når du har brug for at fortsætte midt i en sekvens.

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

Parallel RNG med L'Ecuyer-CMRG

Når du bruger parallel beregning, skal hver proces have en uafhængig RNG-strøm. Generatoren L'Ecuyer-CMRG leverer lange, ikke-overlappende strømme til parallelle arbejdere og sikrer, at resultaterne er uafhængige på tværs af kerner.

# 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 i funktionskald

Hvis du angiver et seed inde i en funktion, påvirker det ikke kalderens RNG-tilstand, efter at funktionen returnerer — fordi funktionens seed-kald ændrer den globale .Random.seed. Vær tydelig omkring seed-håndtering i genanvendelige funktioner.

# 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)  # FALSE

Gengivelig udtagning

Argumentet sample.kind til RNGkind() påvirker specifikt sample(). Siden R 3.6.0 er standarden ændret til 'Rejection' for at opnå bedre ensartethed — brug dette i gengivelige arbejdsgange.

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

Dokumentation af tilfældighed

God praksis i gengivelig forskning: dokumentér din R-version, seed-værdi og RNGkind. Brug sessionInfo() til at gemme oplysninger om hele miljøet. Gem seeds i scriptkommentarer eller en konfigurationsfil.

# 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 i Monte Carlo-undersøgelser

I store simuleringsundersøgelser skal du bruge et enkelt master-seed til at generere seeds for hver gentagelse. Det gør hver gentagelse individuelt gengivelig, samtidig med at det overordnede design forbliver deterministisk.

# 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]

Test af tilfældighed med withr

Pakken withr leverer with_seed(seed, expr), som midlertidigt angiver et seed, evaluerer udtrykket og derefter gendanner den oprindelige RNG-tilstand — perfekt til test uden at forurene den globale tilstand.

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

Hurtigt tjek

Test din forståelse af gengivelighed af RNG i R.

Opsummering: Seed og gengivelighed

Vigtigste pointer: set.seed(n) gør kode med tilfældighed gengivelig. RNGkind() viser eller angiver algoritmen — dokumentér både seed og type. .Random.seed gemmer hele RNG-tilstanden og kan gemmes og gendannes. Til parallel beregning skal du bruge L'Ecuyer-CMRG. I funktioner skal du acceptere en seed-parameter. Brug seeds for hver gentagelse, genereret ud fra et master-seed, i store simuleringer.

# 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')
Gratis at komme i gang

Lær R med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
43
Lektioner
159

Ofte stillede spørgsmål

Er lektionen “set.seed() og reproducerbarhed” gratis?

Ja — alle 3 lektioner i læringssporet R Academy, inklusive “set.seed() og reproducerbarhed”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. R Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “set.seed() og reproducerbarhed”?

Sørg for reproducerbar generering af tilfældige tal på tværs af kørsler med set.seed(). Du øver dig i R Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på R Academy?

Der kræves ingen tidligere erfaring. R Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 4.

Hvor lang tid tager lektionen “set.seed() og reproducerbarhed”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne R Academy-lektion?

Ja. Alle R Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. set.seed() og reproducerbarhed
  2. Generering af sandsynlighedsfordelinger
  3. Grundlæggende Monte Carlo-simulering
  4. Bootstrap-resampling i R
← Tilbage til R Academy