在快速处理循环中的R问题中重置种子(到具有未知值的种子)

在快速处理循环中的R问题中重置种子(到具有未知值的种子),r,random,random-seed,R,Random,Random Seed,我需要在一个循环中多次重置随机种子,因为我必须调用一个函数,该函数将使用专用种子(在我的示例中未显示)绘制特定值。建议使用未知值设置种子的解决方案是调用“rm(.Random.seed,envir=globalenv())”。但是,它实际上会导致设置相同的种子,因为循环的处理速度非常快,以至于globalenv()在循环的多个连续迭代中返回相同的值 在下面的代码中,我在每次循环迭代中调用rm(.Random.seed,envir=globalenv())。可以看出,在从1:100000整数池中随

我需要在一个循环中多次重置随机种子,因为我必须调用一个函数,该函数将使用专用种子(在我的示例中未显示)绘制特定值。建议使用未知值设置种子的解决方案是调用“rm(.Random.seed,envir=globalenv())”。但是,它实际上会导致设置相同的种子,因为循环的处理速度非常快,以至于globalenv()在循环的多个连续迭代中返回相同的值

在下面的代码中,我在每次循环迭代中调用rm(.Random.seed,envir=globalenv())。可以看出,在从1:100000整数池中随机抽取的100000个整数中,只抽取了14522个唯一的数字。相比之下,如果直接从100000张图纸中抽取100000张图纸进行替换,则会抽取63000多个唯一值。差异是由于rm(.Random.seed,envir=globalenv())返回同一种子的次数太多,因为循环处理得太快

#所需代码
T=100000
值=向量(长度=T)
对于(1:T中的i){
值[i]=样本(1:T,1,replace=TRUE)
#一些函数调用一个种子,然后需要随机重置为一个新的种子
rm(.Random.seed,envir=globalenv())
}
长度(唯一(值))
[1] 14522
#反事实
长度(唯一(样本(1:T,T,replace=TRUE)))
[1] 63189

如果我能够重置一个种子(为每个迭代分配一个新的未知种子),那么唯一值的数量将与反事实数字~63000相似,因为, 如
随机
文档条目中所述:

最初,没有种子;当需要时,将根据当前时间和进程ID创建一个新的进程。 因此,默认情况下,不同的会话将给出不同的模拟结果

因此,如果迭代确实很快, 如果每次都删除种子,那么在许多迭代中种子自然是相同的

你不能依赖R的默认行为, 因为它是为不同的课程制作不同的种子,
因此,您必须在循环或类似操作之前填充
值,
如
随机
文档条目中所述:

最初,没有种子;当需要时,将根据当前时间和进程ID创建一个新的进程。 因此,默认情况下,不同的会话将给出不同的模拟结果

因此,如果迭代确实很快, 如果每次都删除种子,那么在许多迭代中种子自然是相同的

你不能依赖R的默认行为, 因为它是为不同的课程制作不同的种子,
因此,您必须在循环或类似操作之前填充
值。

一个解决方案是有两个RNG。其中一个位于您的循环之外,并提供一个伪随机数流。该外部RNG仅在程序开始时播种一次

循环中还有第二个RNG,它从外部RNG获取种子,而不是
globalenv
变量

我不知道R,所以这里有一些伪代码来说明这个概念:

RNG outerRNG(seed = globalenv)

loop
  RNG innerRNG(seed = outerRNG.next())
  do_loop_stuff()
endloop

查看RNG文档,检查它在开始重复之前生成了多少个数字。如果这对您很重要,您可能需要采取措施阻止它重复其序列。

一个解决方案是有两个RNG。其中一个位于您的循环之外,并提供一个伪随机数流。该外部RNG仅在程序开始时播种一次

循环中还有第二个RNG,它从外部RNG获取种子,而不是
globalenv
变量

我不知道R,所以这里有一些伪代码来说明这个概念:

RNG outerRNG(seed = globalenv)

loop
  RNG innerRNG(seed = outerRNG.next())
  do_loop_stuff()
endloop

查看RNG文档,检查它在开始重复之前生成了多少个数字。如果这对您很重要,您可能需要采取措施阻止它重复其序列。

我不确定是否正确理解您的意思,但如果您根本不设置种子,您仍然会得到相同的
长度(唯一(值))
如果设置
set.seed(I),这也是正确的
在循环中。我不确定我是否理解正确,但如果你根本不设置种子,你仍然会得到相同的
长度(唯一(值))
如果你在循环中设置
set.seed(I)
,这也是正确的。