1## A version of base::sample() that does not change .Random.seed
2stealth_sample <- function(x, size = length(x), replace = FALSE, ...) {
3  ## Nothing to do?
4  if (size == 0L) return(x[integer(0)])
5
6  ## Nothing to randomize?
7  if (length(x) == 1L) {
8    return(rep(x, times = size))
9  }
10
11  oseed <- .GlobalEnv$.Random.seed
12  on.exit({
13    if (is.null(oseed)) {
14      rm(list = ".Random.seed", envir = .GlobalEnv, inherits = FALSE)
15    } else {
16      .GlobalEnv$.Random.seed <- oseed
17    }
18  })
19
20  ## Generate a psuedo-random random seed based on the current
21  ## random state and the current time
22  time_offset <- format(Sys.time(), format = "%H%M%OS6")
23  time_offset <- sub(".", "", time_offset, fixed = TRUE)
24  time_offset <- strsplit(time_offset, split = "", fixed = TRUE)[[1]]
25  time_offset <- sample(time_offset)
26  time_offset <- paste(time_offset, collapse = "")
27  time_offset <- as.numeric(time_offset)
28  time_offset <- time_offset %% .Machine$integer.max
29  set.seed(time_offset)
30
31  sample(x, size = size, replace = replace, ...)
32}
33