【问题标题】:How do I stop set.seed() after a specific line of code?如何在特定的代码行之后停止 set.seed()?
【发布时间】:2014-05-08 20:02:40
【问题描述】:

我想在特定行之后结束 set.seed() 的范围,以便对其余代码进行真正的随机化。这是一个示例,我希望 set.seed() 适用于“rnorm”(第 4 行),但不适用于“nrow”(第 9 行)

set.seed(2014)
f<-function(x){0.5*x+2}
datax<-1:100
datay<-f(datax)+rnorm(100,0,5)
daten<-data.frame(datax,datay)
model<-lm(datay~datax)
plot(datax,datay)
abline(model)
a<-daten[sample(nrow(daten),20),]
points(a,col="red",pch=16)
modela<-lm(a$datay~a$datax)
abline(modela, col="red")

确实感谢您的建议!

【问题讨论】:

    标签: r random-seed


    【解决方案1】:

    只需使用当前系统时间通过引入一个新的唯一随机种子来“撤消”种子:

    set.seed(Sys.time())
    

    如果您需要更高的精度,请考虑获取 system timestamp by millisecond(使用 R 的 system(..., intern = TRUE) 函数)。

    【讨论】:

      【解决方案2】:

      set.seed() 仅适用于包含随机样本的第一行,不会影响下一个后续命令。如果您希望它适用于其他行,则必须使用相同的“种子”-参数调用 set.seed 函数。

      【讨论】:

      • 伪随机性不会阻止脚本保持确定性。他希望它在某个点之后是随机的。
      • 这不是真的,请参阅上面@Bastien 的评论。
      【解决方案3】:

      set.seed() 仅适用于下一次执行。所以你想要的已经发生了。

      看这个例子

      set.seed(12)
      sample(1:15, 5)
      

      [1] 2 12 13 4 15

      sample(1:15, 5) # run the same code again you will see different results
      

      [1] 1 3 9 15 12

      set.seed(12)#set seed again to see first set of results
      sample(1:15, 5)
      

      [1] 2 12 13 4 15

      【讨论】:

      • 其实没有。如果你运行set.seed(12),它会启动某种种子循环。第二个sample 调用将始终相同。例如:运行一次set.seed(12)s1a &lt;- sample(1:15, 5),然后运行s2a &lt;- sample(1:15, 5)。然后运行set.seed(12)s1b &lt;- sample(1:15, 5),然后运行s2b &lt;- sample(1:15, 5),您将拥有identical(s1a, s1b)==TRUEidentical(s2a, s2b)==TRUE。对于所有后续示例调用也是如此。
      【解决方案4】:
      set.seed(NULL)
      

      查看帮助文档-?set.seed:

      “如果用 seed = NULL 调用它,它会重新初始化(参见“注意”),就好像还没有设置种子一样。”

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-30
        • 1970-01-01
        • 2012-10-28
        • 1970-01-01
        相关资源
        最近更新 更多