R 我能得到种子吗?

R 我能得到种子吗?,r,R,参考语句set.seed(),如果我没有显式设置种子,那么在运行一些代码后是否可以获得种子 我一直在重新运行一些代码(以交互方式/在控制台上),其中包含一个函数,该函数将输入数据的一些样本随机化(该函数是kohonen包的一部分)。在玩了一段时间以查看输出的多样性(这是一个“不稳定”的问题)之后,我注意到了一个非常有趣的结果。当然,我没有使用set.seed(),但我想知道在运行代码以复制结果之后是否可以获得种子 在?set.seed中我明白了 .Random.seed保存统一随机数生成器的种子

参考语句
set.seed()
,如果我没有显式设置种子,那么在运行一些代码后是否可以获得种子

我一直在重新运行一些代码(以交互方式/在控制台上),其中包含一个函数,该函数将输入数据的一些样本随机化(该函数是
kohonen
包的一部分)。在玩了一段时间以查看输出的多样性(这是一个“不稳定”的问题)之后,我注意到了一个非常有趣的结果。当然,我没有使用
set.seed()
,但我想知道在运行代码以复制结果之后是否可以获得种子

?set.seed中
我明白了

.Random.seed保存统一随机数生成器的种子集


但是我不知道这有什么帮助。

如果你没有保留种子,在你观察到随机抽取后,没有一般的方法“回滚”随机数生成器到以前的状态。接下来,您可能要做的是将
.Random.seed
的值与计算结果一起保存。像这样的

x <- .Random.seed
result <- <your code goes here>
attr(result, "seed") <- x

洪磊的上述回答是有力的。对于快速而肮脏的解决方案,我只是重新执行整个脚本,直到得到有趣的行为,我随机选取一个整数,打印出来,然后将其用作种子。如果我的特定跑步有有趣的行为,我注意到seed:

eff_seed <- sample(1:2^15, 1)
print(sprintf("Seed for session: %s", eff_seed))
set.seed(eff_seed)
eff_seed要添加到给出的答案中,如果您不想手动重新执行脚本——每次迭代生成新的随机种子——您可以执行以下操作:

# generate vector of seeds
eff_seeds <- sample(1:2^15, runs)

# perform 'runs' number of executions of your code
for(i in 1:runs) {
    print(sprintf("Seed for this run: %s", eff_seeds[i]))
    set.seed(eff_seeds[i])

    # your code here
    # don't forget to save your outputs somehow
}
#生成种子向量
有效种子
>格式(5)
[1] -0.17220331 -0.31506128 -0.35264299  0.07259645 -0.15518961
>种子线虫(5)
[1] -0.64965000  0.04787513 -0.14967549  0.12026774 -0.10934254
>种子集(1234)
>rnorm(5)
[1] -1.2070657  0.2774292  1.0844412 -2.3456977  0.4291247
>.随机种子形式(5)
[1] -0.64965000  0.04787513 -0.14967549  0.12026774 -0.10934254

这里试图解决
设置种子
函数没有反向
获取种子
函数的问题。大约12小时前,我发布了一个类似的问题,因为它被归类为“重复”,所以被关闭了

我已经“黑”了一个带有种子内存的解决方案,它需要一个全局变量
.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
的任何自定义参数超过整数(种类、正常种类、样本种类)都需要在
args中列出。set
的省略号
用于
setSeed
将参数传递给
initSeed(…)
一种内部函数,可使
setSeed
getSeed
工作

我还编写了一个C-standard
rand()
函数,它传入一个min、max、n、method等。这就是我如何生成一个“整数”来输入
setSeed
并存储在内存中的方法。我使用
Sys.time()
作为默认种子生成的最小/最大值(
min=-1*as.integer(Sys.time())
max=as.integer(Sys.time())
sample
是个坏主意,因为它必须在范围内创建一个向量来计算单个值,但它是
rand()
的一个方法选项,它提供
initSeed
。我发现默认的“high-low”略快于“floor”

用法 默认情况下,它将种子值存储到全局列表中名为“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);

当然,它可能有bug,如果有任何建议或发现bug,我将不胜感激

--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);

威廉·邓拉普的答案有一些相关信息。谢谢洪。我刚刚澄清了有关在控制台工作的问题,但我认为您已经提供了解决方案。运行代码后,我仍然可以保存
.Random.seed
,对吗?如何获取当前种子?请注意.Random.seed在会话中使用一些随机性之前不存在。因此,您应该在(!exists(“.Random.seed”))set.seed(NULL)
之前加上
,对其进行初始化。我想知道在R中的整数和随机数生成器的状态之间是否存在一对一的对应关系?如果有,在我看来,R可以生成不超过2^32个可能的随机数。如果我们可以将“数值”种子作为
rnorm
对象的属性附加,那就太好了<代码>x=rnorm(5);属性(x)[“种子”]]=123
### 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);
### 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);

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);