在單元測試中,我開始與一個輔助函數(生成測試數據):爲什麼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
輝煌,謝謝。從'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