R Academy · Oppitunti

set.seed() ja toistettavuus

Varmistakaa satunnaislukujen generoinnin toistettavuus eri ajokerroilla set.seed()-funktion avulla.

Oppitunti 1/413 vaihetta

set.seed() ja toistettavuus on ilmainen R Academy-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu R Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. R Academy-kurssilla on yhteensä 4 oppituntia.

Miksi toistettavuus on tärkeää?

Satunnaislukujen generointi on pseudosatunnaista: deterministinen algoritmi, jonka alustaa lähtöarvo. Siemenen asettaminen tekee simulaatioista toistettavia — sama koodi tuottaa aina samat tulokset. Tämä on olennaista virheenkorjauksessa, julkaisemisessa ja opetuksessa.

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

set.seed()-funktion toimintaperiaate

set.seed(n) alustaa satunnaislukugeneraattorin (RNG) tilan. Mikä tahansa positiivinen kokonaisluku käy. Siemen määrittää koko tulevan satunnaislukusarjan siihen asti, kunnes siemen alustetaan uudelleen. Käyttäkää kiinteää lukua toistettavuuden varmistamiseksi.

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

RNGkind() näyttää RNG-algoritmin tai asettaa sen. R:n oletus on Mersenne-Twister ja normaalijakauman menetelmä Inversion. Algoritmi vaikuttaa lukusarjaan, joten dokumentoikaa sekä siemen että RNGkind täydellisen toistettavuuden varmistamiseksi.

# 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-muuttujan tarkasteleminen

.Random.seed on globaali kokonaislukuvektori, joka tallentaa RNG:n koko tilan. Se päivittyy automaattisesti jokaisen satunnaisluvun arvonnan jälkeen. Voitte tallentaa ja palauttaa sen toistaaksenne lukusarjan mistä tahansa kohdasta.

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-tilan tallentaminen ja palauttaminen

Tallentakaa RNG:n tila ennen koodilohkoa ja palauttakaa se myöhemmin, jotta voitte toistaa lohkon täsmälleen. Tämä on joustavampaa kuin set.seed(), kun haluatte jatkaa keskeltä lukusarjaa.

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

Rinnakkainen RNG algoritmilla L'Ecuyer-CMRG

Rinnakkaislaskennassa jokainen prosessi tarvitsee itsenäisen RNG-virran. L'Ecuyer-CMRG -generaattori tarjoaa rinnakkaisille työntekijöille pitkiä, päällekkäistymättömiä virtoja ja varmistaa, että tulokset ovat riippumattomia eri ytimissä.

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

Siemen funktiokutsuissa

Siemenen asettaminen funktion sisällä ei vaikuta kutsujan RNG-tilaan funktion palautumisen jälkeen, koska funktion siemenkutsu muuttaa globaalia .Random.seed-muuttujaa. Määrittele siementen hallinta selkeästi uudelleenkäytettävissä funktioissa.

# 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

Toistettava otanta

RNGkind()-funktion sample.kind-argumentti vaikuttaa nimenomaan sample()-funktioon. R 3.6.0 -versiosta lähtien oletusarvoksi vaihtui 'Rejection' paremman tasaisuuden saavuttamiseksi — käytä tätä toistettavissa työnkuluissa.

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

Satunnaisuuden dokumentointi

Hyvä käytäntö toistettavassa tutkimuksessa on dokumentoida R-versio, siemenen arvo ja RNGkind. Käytä sessionInfo()-funktiota koko ympäristön tallentamiseen. Kirjaa siemenet skriptin kommentteihin tai määritystiedostoon.

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

Siemenet Monte Carlo -tutkimuksissa

Käytä laajoissa simulointitutkimuksissa yhtä pääsiementä replikaattikohtaisten siementen luomiseen. Näin jokainen replikaatti voidaan toistaa erikseen ja kokonaisrakenne säilyy deterministisenä.

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

Satunnaisuuden testaaminen withr-paketilla

withr-paketti tarjoaa funktion with_seed(seed, expr), joka asettaa siemenen väliaikaisesti, suorittaa lausekkeen ja palauttaa sitten alkuperäisen RNG-tilan — tämä sopii erinomaisesti testeihin ilman globaalin tilan muuttamista.

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

Pikatarkistus

Testaa, miten hyvin ymmärrät RNG:n toistettavuuden R:ssä.

Kertaus: siemen ja toistettavuus

Tärkeimmät kohdat: set.seed(n) tekee satunnaisuutta käyttävästä koodista toistettavaa. RNGkind() näyttää tai asettaa algoritmin — dokumentoi sekä siemen että algoritmi. .Random.seed tallentaa koko RNG-tilan, ja sen voi tallentaa ja palauttaa. Käytä rinnakkaislaskennassa L'Ecuyer-CMRG:tä. Ota funktioissa vastaan seed-parametri. Käytä laajoissa simuloinneissa pääsiemenestä luotuja replikaattikohtaisia siemeniä.

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

Opi R tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
43
Oppitunnit
159

Usein kysytyt kysymykset

Onko oppitunti ”set.seed() ja toistettavuus” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa R Academy-oppimispolun 3 oppituntia, myös oppitunnin “set.seed() ja toistettavuus”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. R Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”set.seed() ja toistettavuus”?

Varmistakaa satunnaislukujen generoinnin toistettavuus eri ajokerroilla set.seed()-funktion avulla. Harjoittelet R Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni R Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin R Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.

Kuinka kauan ”set.seed() ja toistettavuus”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä R Academy-oppitunnilla?

Kyllä. Jokainen R Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. set.seed() ja toistettavuus
  2. Satunnaisjakaumien generointi
  3. Monte Carlo -simuloinnin perusteet
  4. Bootstrap-uudelleenotanta R:ssä
← Takaisin: R Academy