2012-12-21 12 views
17

Jestem tutaj nowym użytkownikiem R.Wydrukuj bieżący losowy materiał siewny, aby móc go wprowadzić za pomocą set.seed() później

powiedzmy mam wiersza kodu

set.seed(123456) 

następnie chcę, aby uzyskać wartość 123456 więc mogę wydrukować go dla celów dokumentacji, a w razie potrzeby ponownie wprowadzić wartość kiedyś w przyszłości. Jak więc zdobyć to nasienie?

Zauważ, że mogę skomentować powyższy wiersz kodu, więc nie będę wiedział co to jest za ziarno w 123456. Dlatego potrzebuję r, aby wydrukować lokalizację bieżącego materiału siewnego jako jedną liczbę całkowitą, nie jako listę 626 liczb całkowitych.

+2

Czy nie byłoby łatwiej zrobić 'seed <- 123456; set.seed (seed) 'a następnie wydrukować i zapisać wartość' seed'? – joran

+0

Tak, ale skomentuję linię kodu, gdy nie mam określonego materiału siewnego, od którego chcę zacząć. –

+0

w uczciwości, na tej stronie jest dużo informacji ... –

Odpowiedz

25

Jest skutecznie jednokierunkowy zależność pomiędzy nasion stosowanych w set.seed() i informacji .Random.seed; jako ?Random.seed mówi i odpowiedź @ MattTenenbaum pokazuje, informacje w .Random.seed można zapisać i przywrócić. Doceniam chęć funkcji, które wywodzą prosty nasienie całkowitą od aktualnego stanu .Random.seed, ale w przypadku jej braku, trzeba zapisać i przywrócić pełną informację ... na przykład

set.seed(1001) 
save(".Random.seed",file="random_state_seed1001.RData") ## save current state 
runif(1) 
## [1] 0.9856888 
runif(1) 
## [1] 0.4126285 
runif(1) 
## [1] 0.4295392 
load("random_state_seed1001.RData") ## restore state just after set.seed() 
runif(1) 
## [1] 0.9856888 

Jak @JoshuaUlrich zwraca uwagę, to działa tylko/jest tylko bezpieczny, jeśli nie zmieniają typ RNG (i typ normalny generator odbiegają) pomiędzy oszczędnościami i przywracanie ...

bardziej kompletne rozwiązanie:

save_rng <- function(savefile=tempfile()) { 
    if (exists(".Random.seed")) { 
     oldseed <- get(".Random.seed", .GlobalEnv) 
    } else stop("don't know how to save before set.seed() or r*** call") 
    oldRNGkind <- RNGkind() 
    save("oldseed","oldRNGkind",file=savefile) 
    invisible(savefile) 
} 

restore_rng <- function(savefile) { 
    load(savefile) 
    do.call("RNGkind",as.list(oldRNGkind)) ## must be first! 
    assign(".Random.seed", oldseed, .GlobalEnv) 
} 

Wypróbuj:

set.seed(101) 
RNGstore <- save_rng() ## save file name 
runif(1) 
## [1] 0.3721984 
runif(10) 
## [1] 0.04382482 0.70968402 0.65769040 0.24985572 0.30005483 0.58486663 
## [7] 0.33346714 0.62201196 0.54582855 0.87979573 
restore_rng(RNGstore) 
runif(1) 
## [1] 0.3721984 

Zobacz także: http://www.cookbook-r.com/Numbers/Saving_the_state_of_the_random_number_generator/

+1

To naprawdę nie jest bezpieczne rozwiązanie bez równoczesnego zapewnienia, że ​​rodzaj RNG i normalny są obecnie ustawione na wartości sugerowane przez '.Random.seed'. –

+0

@JoshuaUlrich, czy wiesz, że istnieje przykład pracy, który leży gdzieś w pobliżu miejsca zapisywania i przywracania pełnego stanu RNG (nie ma go w 'przykladzie (" Random.seed ")' o ile mogę powiedzieć)?Jeśli nie, mógłbym zadać sobie trud edycji mojego pytania, w przeciwnym razie po prostu link do niego ... –

+0

Nie znam żadnego takiego przykładu; Wątpię, żeby tak było, bo właśnie do tego służy "set.seed". –

3

Po wywołaniu set.seed powinieneś być w stanie odwołać się do .Random.seed (więcej informacji na stronie: http://stat.ethz.ch/R-manual/R-patched/library/base/html/Random.html).

Prosty przykład:

set.seed(123) 
tmp <- .Random.seed 
> runif(10) 
[1] 0.2875775 0.7883051 0.4089769 0.8830174 0.9404673 0.0455565 0.5281055 0.8924190 0.5514350 0.4566147 
.Random.seed <- tmp 
> runif(10) 
[1] 0.2875775 0.7883051 0.4089769 0.8830174 0.9404673 0.0455565 0.5281055 0.8924190 0.5514350 0.4566147 
+2

Ale .Random.seed daje mi listę 626 liczb całkowitych. –

3

Oto coś, co powinno działać dobrze w praktyce (ale nie powinny być wykorzystywane do np kryptografia):

new.seed <- as.integer(runif(1)*2e9) 
cat("Random seed: ", new.seed, "\n") 
set.seed(new.seed) 

Trzeba faktycznie ustawić nasienie dla tej pracy, więc nie jest to całkiem odpowiedź na oryginalne pytanie, ale może być to, czego szukaliśmy, ponieważ pozwala mieć łatwo określony losowy materiał siewny bez ustawiania go ręcznie za pomocą wcześniej określonej liczby całkowitej.

Powiązane problemy