simulacion - set.seed r para que sirve
Imprima la semilla aleatoria actual para que pueda ingresarla con set.seed() más tarde (3)
Soy un novato R aquí.
Digamos que tengo la línea de código
set.seed(123456)
luego quiero obtener el valor 123456 para poder imprimirlo con fines de documentación y, si es necesario, volver a ingresar el valor en algún momento en el futuro. Entonces, ¿cómo consigo esa semilla?
Tenga en cuenta que puedo comentar la línea de código anterior, así que realmente no sabré qué es el valor inicial en 123456. Por lo tanto, necesito r para imprimir la ubicación del valor inicial actual como un solo entero, no como una lista de 626 enteros.
Aquí hay algo que debería funcionar bien en la práctica (pero no debería usarse para, por ejemplo, la criptografía):
new.seed <- as.integer(runif(1)*2e9)
cat("Random seed: ", new.seed, "/n")
set.seed(new.seed)
Realmente necesita configurar la semilla para que esto funcione, por lo que no es una respuesta a la pregunta original, pero puede ser lo que estaba buscando, ya que le permite tener una semilla aleatoria fácilmente especificada sin configurarla manualmente con un valor predeterminado entero.
Existe efectivamente una relación unidireccional entre la semilla utilizada en set.seed()
y la información en .Random.seed
; ?Random.seed
dice ?Random.seed
y la respuesta de @ MattTenenbaum, la información en .Random.seed
se puede guardar y restaurar. Aprecio el deseo de una función que derive una semilla de entero entero del estado actual de .Random.seed
, pero en su ausencia, debe guardar y restaurar la información completa ... por ejemplo
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
Como señala @JoshuaUlrich, esto solo funciona / solo es seguro si no modifica el tipo de RNG (y el tipo de generador de desviación normal) entre guardar y restaurar ...
Una solución más completa:
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)
}
Pruébalo:
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
Véase también: http://www.cookbook-r.com/Numbers/Saving_the_state_of_the_random_number_generator/
Una vez que haya llamado a set.seed
, debería poder hacer referencia a .Random.seed
(consulte http://stat.ethz.ch/R-manual/R-patched/library/base/html/Random.html para obtener más información ).
Un ejemplo simple:
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