gpt4 book ai didi

r - 为什么RUnit更改我的随机数?

转载 作者:行者123 更新时间:2023-12-04 03:33:13 24 4
gpt4 key购买 nike

在单元测试中,我使用以下命令启动助手功能(生成测试数据):

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 session 中,它是一个包含626个元素的怪物:
[1]         403         624  -169270483  -442010614 ...
...
[617] 197184543 -2095148 ... -689249108

显然,第一个数字是501 vs. 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

这是我的交互式R session 的输出,该输出从命令行使用 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")

请注意, rngKind中的默认 RUnit“Marsaglia-Multicarry”

但是,在基数R中,默认的 RNGkind“Mersenne-Twister” 。从 ?RNGkind:

The currently available RNG kinds are given below. kind is partially matched to this list. The default is "Mersenne-Twister".



因此,要将交互式结果与 RUnit的结果相匹配,您需要在交互式 session 中或在对 RNGkind的初始调用中设置不同的 defineTestSuite

关于r - 为什么RUnit更改我的随机数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11965191/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com