【问题标题】:Why does RUnit change my random numbers?为什么 RUnit 会改变我的随机数?
【发布时间】:2012-08-11 12:08:02
【问题描述】:

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

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 包是由于正在运行其他单元测试。这是批处理脚本的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 会话的输出,它从命令行以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  

【问题讨论】:

    标签: r random runit


    【解决方案1】:

    您似乎正在使用RUnit 包进行单元测试。在这种情况下,您需要注意RUnit 对随机数生成器 (RNGkind) 的 种类 使用不同的默认值。

    来自RUnit manual,以及?defineTestSuite的帮助:

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

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

    但是,在基础 R 中,默认 RNGkind“Mersenne-Twister”。来自?RNGkind

    目前可用的 RNG 种类如下所示。种类是部分 与此列表匹配。默认为“Mersenne-Twister”。


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

    【讨论】:

    • 太棒了,谢谢。从defineTestSuite 帮助它说:“由于历史原因选择了此默认值,与当前的 R 默认值不同”。所以我改变了我的 run_tests.R 使用:rngKind = "Mersenne-Twister",rngNormalKind = "Inversion",我的测试现在通过了!
    猜你喜欢
    • 1970-01-01
    • 2014-11-20
    • 2021-05-04
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 2020-09-04
    • 2013-09-26
    • 1970-01-01
    相关资源
    最近更新 更多