2012-08-15 35 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

相關問題