set.seed() ve Yeniden Üretilebilirlik
set.seed() ile farklı çalıştırmalarda yeniden üretilebilir rastgele sayı üretimini sağlayın.
set.seed() ve Yeniden Üretilebilirlik, CoddyKit'te ücretsiz bir R Academy dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, R Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. R Academy kursu toplamda 4 dersten oluşur.
Yeniden Üretilebilirlik Neden Önemlidir?
Rastgele sayı üretimi sözde rastgeledir: başlangıç değeriyle başlatılan belirlen deterministik bir algoritmadır. seed değerini ayarlamak benzetimlerinizin yeniden üretilebilir olmasını sağlar — aynı kod her zaman aynı sonuçları üretir; bu, hata ayıklama, yayımlama ve öğretim için gereklidir.
# 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() Mekanizması
set.seed(n), rastgele sayı üretecinin (RNG) durumunu başlatır. Herhangi bir pozitif tamsayı kullanılabilir. seed, yeniden ayarlanana kadar üretilecek rastgele sayıların gelecekteki tüm dizisini belirler. Yeniden üretilebilirlik için sabit bir sayı kullanın.
# 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 Algoritması
RNGkind(), RNG algoritmasını gösterir (veya ayarlar). R'nin varsayılanı, normal dağılım yöntemi Inversion olan Mersenne-Twister'dır. Algoritma diziyi etkiler; bu nedenle tam yeniden üretilebilirlik için hem seed hem de RNGkind değerlerini belgeleyin.
# 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 İncelemesi
.Random.seed, RNG durumunun tamamını depolayan genel bir tamsayı vektörüdür. Her rastgele sayı üretiminden sonra otomatik olarak güncellenir. Bir diziyi herhangi bir noktadan yeniden oynatmak için bu değeri kaydedip geri yükleyebilirsiniz.
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 Durumunu Kaydetme ve Geri Yükleme
Bir kod bloğundan önce RNG durumunu kaydedin, ardından bu bloğu daha sonra tamamen yeniden oynatmak için durumu geri yükleyin. Bu, dizinin ortasından devam etmeniz gerektiğinde set.seed() kullanmaktan daha esnektir.
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')L'Ecuyer-CMRG ile Paralel RNG
Paralel hesaplama kullanırken her işlemin bağımsız bir RNG akışına ihtiyacı vardır. L'Ecuyer-CMRG oluşturucusu, paralel çalışanlar için uzun ve çakışmayan akışlar sağlayarak sonuçların çekirdekler arasında bağımsız olmasını garanti eder.
# 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')İşlev Çağrılarında Tohum
Bir işlevin içinde tohum ayarlamak, işlev döndükten sonra çağıranın RNG durumunu etkilemez; çünkü işlevdeki tohum çağrısı genel .Random.seed değerini değiştirir. Yeniden kullanılabilir işlevlerde tohum yönetimini açıkça belirtin.
# 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) # FALSEYeniden Üretilebilir Örnekleme
RNGkind() işlevindeki sample.kind bağımsız değişkeni özellikle sample() işlevini etkiler. R 3.6.0'dan itibaren daha iyi düzgün dağılım için varsayılan değer 'Rejection' olarak değişmiştir; yeniden üretilebilir iş akışlarında bunu kullanın.
# 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)Rastgeleliği Belgeleme
Yeniden üretilebilir araştırmalar için iyi bir uygulama: R sürümünüzü, tohum değerini ve RNGkind değerini belgeleyin. Ortamın tamamını kaydetmek için sessionInfo() kullanın. Tohumları betik açıklamalarına veya bir yapılandırma dosyasına kaydedin.
# 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')Monte Carlo Çalışmalarında Tohumlar
Büyük benzetim çalışmalarında, her yineleme için kullanılacak tohumları üretmek üzere tek bir ana tohum kullanın. Böylece genel tasarım belirlenimli kalırken her yineleme ayrı ayrı yeniden üretilebilir.
# 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]withr ile Rastgeleliği Test Etme
withr paketi, bir tohumu geçici olarak ayarlayan, ifadeyi değerlendiren ve ardından özgün RNG durumunu geri yükleyen with_seed(seed, expr) işlevini sağlar; genel durumu kirletmeden testler yapmak için idealdir.
# 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))Hızlı Kontrol
R'de RNG yeniden üretilebilirliği konusundaki anlayışınızı test edin.
Özet: Tohum ve Yeniden Üretilebilirlik
Temel çıkarımlar: set.seed(n) rastgele kodu yeniden üretilebilir kılar. RNGkind() algoritmayı görüntüler veya ayarlar; hem tohumu hem de türü belgeleyin. .Random.seed tam RNG durumunu saklar ve kaydedilip geri yüklenebilir. Paralel hesaplama için L'Ecuyer-CMRG kullanın. İşlevlerde bir seed parametresi kabul edin. Büyük benzetimlerde ana tohumdan üretilen yineleme başına tohumları kullanın.
# 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')Sıkça Sorulan Sorular
“set.seed() ve Yeniden Üretilebilirlik” dersi ücretsiz mi?
Evet — “set.seed() ve Yeniden Üretilebilirlik” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve R Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. R Academy kursu toplamda 4 dersten oluşur.
“set.seed() ve Yeniden Üretilebilirlik” dersinde ne öğreneceğim?
set.seed() ile farklı çalıştırmalarda yeniden üretilebilir rastgele sayı üretimini sağlayın. R Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
R Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te R Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.
“set.seed() ve Yeniden Üretilebilirlik” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu R Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her R Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- set.seed() ve Yeniden Üretilebilirlik
- Rastgele Dağılımlar Üretme
- Monte Carlo Simülasyonunun Temelleri
- R'de Bootstrap Yeniden Örnekleme