为什么RUnit会改变我的随机数?

Dar*_*ook 9 random r runit

在单元测试中,我启动一个辅助函数(生成测试数据):

set.seed(1)
Run Code Online (Sandbox Code Playgroud)

我正在以交互方式开发单元测试,如下所示:

source('tests/runit.functions.R');test.something()
Run Code Online (Sandbox Code Playgroud)

但是当我从我的测试中运行时,run_tests.R他们失败了.尽管有set.seed(1)命令,我把它缩小到不同的随机数!我在set.seed(1)之后添加了这一行:

print(sessionInfo());print("RANDOM SEED:");print(.Random.seed)
Run Code Online (Sandbox Code Playgroud)

真正有趣的部分是随机种子完全不同.在批处理脚本中,它只有三个数字:

501 1280795612 -169270483
Run Code Online (Sandbox Code Playgroud)

在我的交互式R会话中,它是一个626元素的怪物:

[1]         403         624  -169270483  -442010614 ...
 ...
[617]   197184543    -2095148  ... -689249108
Run Code Online (Sandbox Code Playgroud)

第一个数字,501与403,显然是随机数生成器的类型,但我无法追踪主列表中数字的含义.

我认为我的问题的核心是确保我的单元测试具有可靠的随机数生成的最佳方法是什么?第二个问题是故障排除建议:如何跟踪正在使用哪个随机数生成器(更重要的是)哪个代码/包/设置决定使用它?

sessionInfo不看非常有帮助的,但它显示出一些小的差异.例如,包含TTR包是由于正在运行其他单元测试.这是sessionInfo批处理脚本的输出,第一行是#!/usr/bin/Rscript --slave:

R version 2.15.1 (2012-06-22)
Platform: x86_64-pc-linux-gnu (64-bit)

locale:
 [1] LC_CTYPE=en_US.utf8       LC_NUMERIC=C              LC_TIME=en_US.utf8        LC_COLLATE=en_US.utf8     LC_MONETARY=en_US.utf8    LC_MESSAGES=en_US.utf8   
 [7] LC_PAPER=C                LC_NAME=C                 LC_ADDRESS=C              LC_TELEPHONE=C            LC_MEASUREMENT=en_US.utf8 LC_IDENTIFICATION=C      

attached base packages:
[1] methods   stats     graphics  grDevices utils     datasets  base     

other attached packages:
[1] TTR_0.21-1   xts_0.8-6    zoo_1.7-7    RUnit_0.4.26

loaded via a namespace (and not attached):
[1] grid_2.15.1    lattice_0.20-6
Run Code Online (Sandbox Code Playgroud)

这是我的交互式R会话的输出,它是从命令行启动的R --no-save:

R version 2.15.1 (2012-06-22)
Platform: x86_64-pc-linux-gnu (64-bit)

locale:
 [1] LC_CTYPE=en_US.utf8       LC_NUMERIC=C              LC_TIME=en_US.utf8        LC_COLLATE=en_US.utf8     LC_MONETARY=en_US.utf8    LC_MESSAGES=en_US.utf8   
 [7] LC_PAPER=C                LC_NAME=C                 LC_ADDRESS=C              LC_TELEPHONE=C            LC_MEASUREMENT=en_US.utf8 LC_IDENTIFICATION=C      

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] xts_0.8-6    zoo_1.7-7    RUnit_0.4.26

loaded via a namespace (and not attached):
[1] grid_2.15.1    lattice_0.20-6 tools_2.15.1  
Run Code Online (Sandbox Code Playgroud)

And*_*rie 13

您似乎正在使用该RUnit软件包进行单元测试.在这种情况下,您需要知道RUnit对于随机数生成器()的类型使用不同的默认值RNGkind.

RUnit手册和帮助?defineTestSuite:

defineTestSuite(name, dirs, testFileRegexp = "^runit.+\\.[rR]$",
  testFuncRegexp = "^test.+",  
  rngKind = "Marsaglia-Multicarry",
  rngNormalKind = "Kinderman-Ramage")
Run Code Online (Sandbox Code Playgroud)

请注意,默认rngKindRUnit"马尔萨利亚-Multicarry".

但是,在基数R中,默认RNGkind"Mersenne-Twister".来自?RNGkind:

目前可用的RNG种类如下.kind与此列表部分匹配.默认为"Mersenne-Twister".


因此,为了使您的交互式结果与结果相匹配RUnit,您需要RNGkind在交互式会话或初始调用中设置不同的结果defineTestSuite.