【问题标题】:How to fix the random seed of sample function in R如何在R中修复样本函数的随机种子
【发布时间】:2021-04-15 17:16:00
【问题描述】:

我想知道如何修复 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

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

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

感谢您抽出宝贵时间阅读此问题。

【问题讨论】:

  • 你的问题有点混乱。您显示的是预期的行为。如果您希望每个 sample(tmp, size=3) 返回相同的值,则需要在每次调用 sample 之前设置种子
  • 据我了解,set.seed()“初始化”当前随机数生成器的状态。每次调用随机数生成器更新它的状态。所以每次调用sample() 都会为生成器生成一个新状态。如果您希望对sample() 的每次调用都返回相同的值,则需要在每次对sample() 的调用之前调用set.seed()。您发布的行为是预期的。

标签: r random random-seed


【解决方案1】:

可能是这样的

{set.seed(1); sample( tmp, 3 )}

[1] 9 4 7

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

【讨论】:

    【解决方案2】:

    我认为您的帖子可以回答这个问题。如果您注意到设置种子后的第一个样本是相同的,这就是它应该做的:

    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
    

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-04-18
        • 1970-01-01
        • 1970-01-01
        • 2012-03-26
        • 1970-01-01
        • 2016-11-04
        • 2016-12-30
        • 1970-01-01
        相关资源
        最近更新 更多