2012-08-15 3 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 связано с выполнением других модульных тестов. Вот 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 

ответ

13

Кажется, вы используете пакет 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:

Представленные в настоящее время виды RNG приведены ниже. вид частично соответствует этому списку. По умолчанию используется «Mersenne-Twister».


Таким образом, в соответствии с вашими интерактивными результаты с результатами RUnit, вам нужно установить другой RNGkind, либо в интерактивной сессии или в первоначальном вызове defineTestSuite.

+0

Блестящий, спасибо. Из справки 'defineTestSuite' в нем говорится:« _Это значение по умолчанию выбрано по историческим причинам и отличается от текущего R default_ ». Поэтому я изменил свой run_tests.R, чтобы использовать: rngKind = «Mersenne-Twister», rngNormalKind = «Инверсия», и мои тесты теперь проходят! –

+0

+1 Не знал об этом, странное решение. – Hansi

Смежные вопросы