2012-08-15 9 views
9

私はヘルパー関数(テストデータを生成する)を開始:RUnitが乱数を変更するのはなぜですか?ユニットテストで

set.seed(1) 

私は対話的にこのようなユニットテスト開発していた:

source('tests/runit.functions.R');test.something() 

をしかし、その後、私は実行するために行ったとき私のrun_tests.Rからのテストは失敗しました。私はset.seed(1)コマンドにもかかわらず、それを異なる乱数に絞りました!私は、(1)直後set.seed、この行を追加:

print(sessionInfo());print("RANDOM SEED:");print(.Random.seed) 

本当に興味深い部分は、ランダムシードが全く異なっています。私の対話型のRセッションで、それは626要素のモンスターであるのに対し

501 1280795612 -169270483 

[1]   403   624 -169270483 -442010614 ... 
... 
[617] 197184543 -2095148 ... -689249108 

最初の数、501対403で、あるバッチスクリプトではそれだけで3つの数字であります明らかに乱数ジェネレータのタイプですが、数字が意味するもののマスターリストを追跡できませんでした。

私の質問の中核は、私の単体テストが確実な乱数生成を確実にするための最善の方法だと思いますか?副次的な質問は、トラブルシューティングのアドバイスです:どの乱数ジェネレータが使用されているか(さらに重要なのは)どのコード/パッケージ/設定がそれを使用することに決めたのかをどのように追跡するのですか?

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 --no-saveでコマンドラインから開始され、私の対話型のRセッションからの出力は、次のとおりです。

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のヘルプ:RUnitのデフォルトrngKind"Marsaglia-Multicarry"であることを

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

注意してください。

ただし、ベースRでは、デフォルトのRNGkind"メルセンヌ - ツイスター"です。から?RNGkind

現在利用可能なRNGの種類を以下に示します。種別は部分的には です。デフォルトは "Mersenne-Twister"です。


ので、RUnitの結果を使用してインタラクティブな結果と一致するように、あなたはあなたの対話セッションやdefineTestSuiteにあなたの最初の呼び出しのいずれかで、異なるRNGkindを設定する必要があります。

+0

賢い、ありがとう。 'defineTestSuite'ヘルプから、「このデフォルトは歴史的な理由から選択されましたが、現在のR default_とは異なります」と書かれています。だから私はrun_tests.Rを使って、 'rngKind =" Mersenne-Twister "、rngNormalKind =" Inversion "'を変更しました。 –

+0

+1これについて、奇妙な決定を知りませんでした。 – Hansi

関連する問題