为什么RUnit会改变我的随机数字?
在单元测试中,我开始与一个辅助函数(生成测试数据):为什么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 --slave
sessionInfo
输出:
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
看来你正在使用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
初始调用。
辉煌,谢谢。从'defineTestSuite'帮助它说:“_由于历史原因已经选择了该默认值,并且与当前的R default_不同。所以我改变了我的run_tests.R使用:'rngKind =“Mersenne-Twister”,rngNormalKind =“Inversion”'我的测试现在通过! – 2012-08-15 07:57:53
+1不知道这个,奇怪的决定,但。 – Hansi 2012-08-15 09:21:14