Skip to content

Instantly share code, notes, and snippets.

@topepo
Created July 3, 2025 14:49
Show Gist options
  • Save topepo/ac2aa725deaf0f15a3b6691eac90efd6 to your computer and use it in GitHub Desktop.
Save topepo/ac2aa725deaf0f15a3b6691eac90efd6 to your computer and use it in GitHub Desktop.
generate seed objects for parallel workers
get_parallel_seeds <- function(workers) {
# Get current rng info and save
orig_state <- .Random.seed
orig_kind <- RNGkind()[1]
# Reset the stream to get new rng's
on.exit({
RNGkind(orig_kind)
assign(".Random.seed", orig_state, globalenv())
})
# Set to type used for multiple streams
RNGkind("L'Ecuyer-CMRG")
# Capture the seed to make more seeds.
runif(1)
.seed <- .Random.seed
res <- vector(mode = "list", length = workers)
for (i in seq_along(res)) {
res[[i]] <- parallel::nextRNGSubStream(.seed)
.seed <- parallel::nextRNGStream(.seed)
}
res
}
before_kind <- RNGkind()
set.seed(1)
before_rnd <- runif(1)
set.seed(1)
tmp <- get_parallel_seeds(3)
after_rnd <- runif(1)
RNGkind()
all.equal(before_kind, RNGkind())
all.equal(before_rnd, after_rnd)
# assign(".Random.seed", tmp[[1]], envir = .GlobalEnv)
# runif(1)
# assign(".Random.seed", tmp[[1]], envir = .GlobalEnv)
# runif(1)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment