为什么RUnit会改变我的随机数?
在单元测试中,我使用以下命令启动辅助函数(生成测试数据): 我以交互方式开发单元测试,如下所示:为什么RUnit会改变我的随机数?,r,random,runit,R,Random,Runit,在单元测试中,我使用以下命令启动辅助函数(生成测试数据): 我以交互方式开发单元测试,如下所示: source('tests/runit.functions.R');test.something() 但是当我从我的run\u tests.R运行测试时,它们失败了。尽管使用了set.seed(1)命令,我还是将其缩小为不同的随机数!我在set.seed(1)之后添加了这一行: 真正有趣的是随机种子是完全不同的。在批处理脚本中,只有三个数字: 501 1280795612 -169270483
source('tests/runit.functions.R');test.something()
但是当我从我的run\u tests.R
运行测试时,它们失败了。尽管使用了set.seed(1)
命令,我还是将其缩小为不同的随机数!我在set.seed(1)之后添加了这一行:
真正有趣的是随机种子是完全不同的。在批处理脚本中,只有三个数字:
501 1280795612 -169270483
而在我的交互式R会话中,它是一个626元素的怪物:
[1] 403 624 -169270483 -442010614 ...
...
[617] 197184543 -2095148 ... -689249108
第一个数字,501对403,显然是随机数生成器的类型,但我无法找到主列表中这些数字的含义
我想我的问题的核心是什么是确保我的单元测试有可靠的随机数生成的最佳方法?第二个问题是故障排除建议:我如何跟踪正在使用的随机数生成器(更重要的是)哪个代码/包/设置决定使用它
sessionInfo
看起来不是很有帮助,但它显示了一些小的差异。例如,包含TTR包是因为正在运行其他单元测试。下面是批处理脚本的sessionInfo
输出,其中第一行是#/usr/bin/Rscript--从机
:
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 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
这是我的交互式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] 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 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
)使用不同的默认值
从,以及?defineTestSuite
的帮助:
defineTestSuite(name, dirs, testFileRegexp = "^runit.+\\.[rR]$",
testFuncRegexp = "^test.+",
rngKind = "Marsaglia-Multicarry",
rngNormalKind = "Kinderman-Ramage")
请注意,RUnit
中的默认rngKind
是“Marsaglia多载波”
但是,在基本R中,默认的RNGkind
是“Mersenne Twister”。从?RNGkind
:
目前可用的RNG类型如下所示。种类是部分的
与此列表匹配。默认值为“Mersenne Twister”
因此,要将交互式结果与运行它的结果相匹配,您需要在交互式会话中或在首次调用
defineTestSuite
时设置不同的RNGkind
,谢谢。在defineTestSuite
帮助中,它说:“此默认值是由于历史原因选择的,与当前的R默认值不同。”。因此,我将run_tests.R改为使用:rngKind=“Mersenne Twister”,rngNormalKind=“Inversion”
,现在我的测试通过了!