这里尝试解决setSeed 函数没有逆getSeed 函数的问题。大约十二小时前,我在Using R, how to get.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); # trimMe function
include.me = paste0(github.monte, "humanVerse/main/humanVerse/R/functions-random.R");
source(include.me); # getSeed, setSeed, and so on.
函数setSeed 的行为通常类似于set.seed,但任何传递给set.seed 的自定义参数超出整数(kind、normal.kind、sample.kind)都需要在args.set 中作为省略号@987654332 列出@ for setSeed 用于将参数传递给initSeed(...) 一个使setSeed 和getSeed 能够工作的内部函数。
我还编写了一个 C 标准的 rand() 函数,它传入一个 min、max、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); # randomly generated seed under the hood, but stored
setSeed(123, "z5"); rnorm(5); # you can still fix the seed manually yourself, still stored and accessible in the list
setSeed(getSeed("nsim"), "nsim"); rnorm(5);
setSeed(getSeed("z5"), "z5"); rnorm(5);