如何在R中固定样本函数的随机种子



我想知道如何修复R.中样本函数的随机种子

这里有一个简单的例子:

set.seed(1)
tmp <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
sample(tmp, size = 3)       # (*)
#[1] 9 4 7
sample(tmp, size = 3)       # (**)
#[1] 1 2 5
sample(tmp, size = 3)       # (***)
#[1] 7 2 3
sample(tmp, size = 3)       # (****)
#[1] 3 1 5
# retry set the random seed
set.seed(1)
sample(tmp, size = 3)       # (*)
#[1] 9 4 7
sample(tmp, size = 3)       # (**)
#[1] 1 2 5
sample(tmp, size = 3)       # (***)
#[1] 7 2 3
sample(tmp, size = 3)       # (****)
#[1] 3 1 5

然后,当我重复示例函数时,返回的值会发生变化,尽管变化的模式是一致的。

我不明白为什么sample函数与set.seed受到不同的影响。如何修复示例函数的返回?

感谢您花时间阅读此问题。

类似的东西可能是

{set.seed(1); sample( tmp, 3 )}
[1] 9 4 7

无论何时调用,都会返回相同的结果

我认为你的帖子在某种程度上回答了这个问题。如果你注意到设定种子后的第一个样本是一样的,这就是它应该做的:

set.seed(1)
tmp <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
sample(tmp, size = 3)
[1] 9 4 7
sample(tmp, size = 3)
[1] 1 2 5
set.seed(1)
tmp <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
sample(tmp, size = 3)
[1] 9 4 7
sample(tmp, size = 3)
[1] 1 2 5

种子落地后的第一组三次平局是相同的。三人中的第二场平局是一样的。

也许通过观察6个随机选择值的第一次绘制,可以更容易地了解set.seed是如何工作的:

set.seed(1)
tmp <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
sample(tmp, size = 6)
[1] 9 4 7 1 2 5

您的问题似乎反映了对伪随机数生成器(PRNG(和种子的基本误解。PRNG保持包含固定比特数的内部状态,并通过应用确定性函数从当前状态前进到下一状态。该函数决定了;"随机";基于状态的输出序列看起来是随机的,即使它实际上不是随机的(因此是伪前缀(。给定固定数量的比特,算法最终会重复其内部状态,此时整个序列会重复,因为它是确定性的。这样做所需的时间称为PRNG的周期长度。

一旦你意识到所有的PRNG最终都会重复它们的序列,就很容易看出一个种子只不过是为这个循环提供了一个入口点。很多人错误地认为种子会影响PRNG的质量,但这是不正确的。质量是基于确定性转换函数,而不是基于种子。

那么,为什么PRNG允许您指定种子呢?基本上是为了再现性。首先,如果不能重现暴露错误的数据,那么调试程序真的很困难。使用相同的种子重新运行将使您能够追踪到导致问题的原因。第二,这允许对替代制度进行更公平的比较。假设你想比较一下当你增加一名店员或出纳员时,杂货店或银行是如何运作的。如果您通过控制种子设定来对同一组客户和客户事务运行这两种配置,则这些配置之间的差异将直接归因于系统配置的更改。在不控制播种的情况下,差异可能会因序列的随机性而减弱或放大。是的,从长远来看,这将通过抽取更大的样本来实现,但关键是,你可以通过巧妙地使用种子而不是增加样本量来减少答案的方差。

最重要的是,您的示例完全按照预期工作。当以相同的方式采样时,重置种子会产生相同的随机性序列。

最新更新