【问题标题】:Same Random Numbers Every Time每次相同的随机数
【发布时间】:2017-02-22 16:48:28
【问题描述】:

我正在通过命令行运行脚本 R CMD BATCH script.in.R script.out.R &

我有以下行,它选择 12 个随机行 ID 并对它们进行排序:

test.index<-sort(sample(1:nrow(recoded),12))

如果我不更改脚本,它每次都会吐出相同的 12 个数字。如果我稍微改变一下(改变标签或字符串或任何东西),那么数字就会不同......我需要它们每次都不同!

有什么想法吗?

【问题讨论】:

  • 如果您在交互式 R 会话中运行脚本,是否会出现相同的行为?
  • 为了确定,recoded 中确实有超过 12 行,不是吗?否则那行代码只会吐出 1 到 12。
  • 还可以尝试将脚本更改为仅该行,以确认问题确实出在其他地方。

标签: r


【解决方案1】:

这听起来很奇怪。脚本的其余部分在做什么?如果它调用(或它调用的一些其他函数)set.seed,这将解释事情,但既然你说改变(我假设是)数据,这意味着种子已设置到你的数据集的一些哈希?!还是如果您以任何方式更改脚本

无论如何,您可以在调用sample 之前插入类似rm(.Random.seed, envir=globalenv()) 的行,这应该会将种子重置为随机的...

另一种方法是自己生成一个独特的种子。这是一种基于时间和进程 ID 的方法。

 set.seed( as.integer((as.double(Sys.time())*1000+Sys.getpid()) %% 2^31) )

【讨论】:

    【解决方案2】:

    你可能在那里打了一个电话给set.seed()。这是一个例子:

    $ Rscript -e 'runif(4)'      
    [1] 0.639716 0.976892 0.486573 0.525979
    
    $ Rscript -e 'runif(4)'
    [1] 0.516927 0.951013 0.931756 0.741650
    
    $ Rscript -e 'runif(4)'
    [1] 0.159682 0.314798 0.356476 0.584326
    
    $ Rscript -e 'set.seed(42); runif(4)'
    [1] 0.914806 0.937075 0.286140 0.830448
    
    $ Rscript -e 'set.seed(42); runif(4)'
    [1] 0.914806 0.937075 0.286140 0.830448
    
    $ 
    

    前三个都不同,然后我强制执行一个共同的种子,presto数字是相同的。

    另外,RscriptR CMD BATCH 更好。

    【讨论】:

    • 这不太可能,但这也可能是由于未重置正在调用的编译代码中的随机种子造成的。
    • 我有点困惑(请原谅我的新手),一切似乎都与我想要的相反。默认情况下,你的数字是随机的,然后你必须做一些事情来使它们相同......我很困惑..我还没有设置种子但我的数字总是一样的!
    • @user964373 Dirk 说明您的代码中可能会调用set.seed()。如果你删除它,你应该在每次运行时得到不同的值。
    • 要么你有一个set.seed()强制你的数字是相同的(所以你需要删除它),或者你至少可以尝试通过添加来强制随机性类似set.seed(as.numeric(Sys.time())。无论哪种方式,您都必须查看您的代码,因为我展示了 R 默认情况下在启动时使用不同的种子
    • 噢噢我明白了。明白了。我在我的代码中找不到 set.seed ,但我正在使用的一个库中可能有一个。谢谢!
    【解决方案3】:

    检查您是否尚未加载任何以前的工作区。如果有,也会加载前一个种子,从而为您提供相同的结果。

    【讨论】:

    • 这将作为评论,而不是答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-08
    • 2012-03-04
    • 1970-01-01
    • 2018-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多