2012-08-15 65 views
9

在单元测试中,我开始与一个辅助函数(生成测试数据):为什么RUnit会改变我的随机数字?

set.seed(1) 

我是交互开发单元测试是这样的:

source('tests/runit.functions.R');test.something() 

但是当我去运行我的run_tests.R测试失败。尽管使用了set.seed(1)命令,我仍将其缩小为不同的随机数字!我在set.seed(1)后面添加了这一行:

print(sessionInfo());print("RANDOM SEED:");print(.Random.seed) 

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

501 1280795612 -169270483 

而在我的互动R对话这是一个626元的怪物:

[1]   403   624 -169270483 -442010614 ... 
... 
[617] 197184543 -2095148 ... -689249108 

第一号,501与403,是显然是随机数发生器的类型,但我无法追踪数字意思的主列表。

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

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

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 

,这里是从我的互动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 

回答

13

看来你正在使用RUnit包进行单元测试。在这种情况下,您需要知道RUnit对随机数生成器的使用不同的默认值(RNGkind)。

RUnit manual和帮助?defineTestSuite

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

注意,在RUnit默认rngKind“马尔萨利亚-Multicarry”

但是,在基准R中,默认RNGkind“Mersenne-Twister”。 From ?RNGkind

当前可用的RNG种类如下。类型部分 匹配到此列表。默认值是“Mersenne-Twister”。


所以,以配合您用RUnit结果互动的结果,你需要设置不同的RNGkind,无论是在交互式会话或在你来defineTestSuite初始调用。

+0

辉煌,谢谢。从'defineTestSuite'帮助它说:“_由于历史原因已经选择了该默认值,并且与当前的R default_不同。所以我改变了我的run_tests.R使用:'rngKind =“Mersenne-Twister”,rngNormalKind =“Inversion”'我的测试现在通过! – 2012-08-15 07:57:53

+0

+1不知道这个,奇怪的决定,但。 – Hansi 2012-08-15 09:21:14

相关问题