Подтвердить что ты не робот

Распечатайте текущее случайное семя, чтобы я мог ввести его с помощью set.seed() позже

Я новичок в R здесь.

скажем, у меня есть строка кода

set.seed(123456)

то я хочу получить значение 123456, чтобы я мог распечатать его для целей документирования, и, если потребуется, повторно введите значение в будущем. Итак, как мне получить это семя?

Обратите внимание, что я могу прокомментировать приведенную выше строку кода, поэтому я фактически не знаю, что такое семя на 123456. Поэтому мне нужно r, чтобы распечатать местоположение текущего семени в виде единственного целого, а не как список из 626 целых чисел.

4b9b3361

Ответ 1

Эффективно односторонняя связь между семенем, используемым в set.seed(), и информацией в .Random.seed; как говорит ?Random.seed и ответ @MattTenenbaum, информация в .Random.seed может быть сохранена и восстановлена. Я ценю желание функции, которая выводит простое целое число из текущего состояния .Random.seed, но в его отсутствие вам нужно сохранить и восстановить полную информацию... например

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

Как указывает @JoshuaUlrich, это работает только в том случае, если вы не изменяете тип RNG (и тип генератора нормального отклонения) между сохранением и восстановлением...

Более полное решение:

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

Попробуйте:

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

Смотрите также: http://www.cookbook-r.com/Numbers/Saving_the_state_of_the_random_number_generator/

Ответ 2

Как только вы вызвали set.seed, вы должны иметь возможность ссылаться на .Random.seed (см. http://stat.ethz.ch/R-manual/R-patched/library/base/html/Random.html для получения дополнительной информации).

Простой пример:

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

Ответ 3

Здесь что-то, что должно на практике работать нормально (но не должно использоваться для криптографии):

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

Вам действительно нужно установить семена для этого, чтобы он не отвечал на исходный вопрос, но может быть тем, что вы искали, поскольку он позволяет вам легко определить случайное семя, не устанавливая его вручную с заданным целым числом.