set.seed() ja toistettavuus
Varmistakaa satunnaislukujen generoinnin toistettavuus eri ajokerroilla set.seed()-funktion avulla.
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 clarityRNGkind(): 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) # FALSEToistettava 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')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
- set.seed() ja toistettavuus
- Satunnaisjakaumien generointi
- Monte Carlo -simuloinnin perusteet
- Bootstrap-uudelleenotanta R:ssä