这里是尝试解决没有反向getSeed
函数的setSeed
函数问题的一种方法。我在使用R,如何获取.seed()?上发布了一个类似的问题,大约十二个小时前关闭了,因为它被归类为“重复”...
我已经“黑客式”地用种子内存构建了一个解决方案,需要一个全局变量.random.seed.memory
。
utils::globalVariables(c(".random.seed.memory"))
时间非常重要,因为我必须使用set.seed
来“生成种子”
github.monte = "https://raw.githubusercontent.com/MonteShaffer/"
include.me = paste0(github.monte, "humanVerse/main/humanVerse/R/functions-str.R")
source(include.me)
include.me = paste0(github.monte, "humanVerse/main/humanVerse/R/functions-random.R")
source(include.me)
setSeed
函数的行为通常类似于 set.seed
,但是除了整数(kind、normal.kind、sample.kind)之外,传递给 set.seed
的任何自定义参数需要在 args.set
中列出,因为 setSeed
中的省略号 ...
用于将参数传递给 initSeed(...)
,这是一种内部函数,使 setSeed
和 getSeed
能够正常工作。
我还编写了一个符合C标准的rand()
函数,它可以传入最小值、最大值、n值、方法等参数。这是我生成要输入到setSeed
并存储在内存中的“整数”的方法。我使用Sys.time()
作为默认种子生成的最小/最大值(min = -1*as.integer(Sys.time())
和max = as.integer(Sys.time())
)。sample
不是一个好主意,因为它必须创建一个范围内的向量来计算单个值,但它是rand()
的一种方法选项,用于输入到initSeed
。我发现默认的“high-low”比“floor”略快。
用法
### VERBOSITY is HIGH AT THE MOMENT ###
print("random 5"); rnorm(5);
setSeed(NULL); # this will automatically call initSeedMemory() if necessary
setSeed(.random.seed.memory$last); rnorm(5);
setSeed(getSeed()); rnorm(5);
print("random 5"); rnorm(5);
setSeed(getSeed()); rnorm(5);
默认情况下,它将种子值存储到全局列表中的一个元素中,称为“last”… 这使您能够跟踪不同的内存种子,具体取决于您正在运行的进程。 在下面的示例中,我特别访问了“last”和“nsim”…第二个存储在内存中的种子...
### VERBOSITY is HIGH AT THE MOMENT ###
initSeedMemory( purge.memory = TRUE);
setSeed(NULL);
setSeed(.random.seed.memory$last); rnorm(5);
setSeed(getSeed()); rnorm(5);
getSeed(); # accessor to .random.seed.memory
.random.seed.memory;
print("random 5"); rnorm(5);
setSeed(NULL, key="nsim"); rnorm(5);
setSeed(.random.seed.memory$nsim, key="nsim"); rnorm(5);
setSeed(getSeed("nsim"), key="nsim"); rnorm(5);
getSeed("nsim"); # accessor to .random.seed.memory
.random.seed.memory;
print("random 5"); rnorm(5);
setSeed(.random.seed.memory$last); rnorm(5);
setSeed(getSeed()); rnorm(5);
.random.seed.memory;
set.seed(.random.seed.memory$last); rnorm(5);
set.seed(.random.seed.memory$nsim); rnorm(5);
.random.seed.memory;
print("random 5"); rnorm(5);
当然,它可能存在漏洞,如果有任何建议或发现漏洞,我将不胜感激。
-- 2021年2月19日太平洋标准时间上午5点左右 --
当然,也可以传入一个固定的种子。
setSeed(NULL, "nsim"); rnorm(5);
setSeed(123, "z5"); rnorm(5);
setSeed(getSeed("nsim"), "nsim"); rnorm(5);
setSeed(getSeed("z5"), "z5"); rnorm(5);