2012-08-15 17 views
9

En una prueba de unidad comienzo una función auxiliar (generar datos de prueba) con:¿Por qué RUnit cambia mis números aleatorios?

set.seed(1) 

que estaba desarrollando la prueba de la unidad interactiva de esta manera:

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

Pero entonces cuando fui a ejecutar el las pruebas de mi run_tests.R fallaron. Lo reduje a diferentes números aleatorios, ¡a pesar del comando set.seed(1)! He añadido esta línea, justo después de set.seed (1):

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

La parte realmente interesante es la semilla aleatoria es completamente diferente. En la secuencia de comandos por lotes que está a sólo tres números:

501 1280795612 -169270483 

Mientras que en mi sesión interactiva R es un monstruo 626-elemento:

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

El primer número, el 501 frente a 403, es el tipo de generador de números aleatorios, aparentemente, pero no pude rastrear la lista maestra de lo que significan los números.

Creo que el núcleo de mi pregunta es ¿cuál es la mejor manera de asegurarme de que las pruebas de mi unidad tengan una generación de números aleatorios confiable? Una segunda pregunta es la solución de problemas: ¿cómo puedo rastrear qué generador de números aleatorios se está utilizando (y más importante aún) qué código/paquete/configuración decidí usar? El sessionInfo no parece muy útil, pero muestra algunas pequeñas diferencias. P.ej. la inclusión del paquete TTR se debe a otras pruebas unitarias que se están ejecutando. Aquí es sessionInfo salida del script por lotes, donde la primera línea es #!/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 

Y aquí está la salida de mi sesión de R interactiva, que se inicia desde la línea de comandos con 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 

Respuesta

13

Parece que está utilizando el paquete RUnit para las pruebas de su unidad. En este caso, debe tener en cuenta que RUnit utiliza un valor predeterminado diferente para tipo de generador de números aleatorios (RNGkind).

Desde el RUnit manual, y la ayuda para ?defineTestSuite:

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

en cuenta que el valor por defecto en rngKindRUnit es "Marsaglia-Multicarry".

Sin embargo, en la base R, el valor predeterminado RNGkind es "Mersenne-Twister". De ?RNGkind:

Los tipos de RNG disponibles actualmente se indican a continuación. kind es parcialmente con esta lista. El valor predeterminado es "Mersenne-Twister".


Por lo tanto, para que coincida con los resultados interactivos con los resultados de RUnit, es necesario establecer una diferente RNGkind, ya sea en su sesión interactiva o en su llamada inicial a defineTestSuite.

+0

Brillante, gracias. De la ayuda 'defineTestSuite' dice:" _este valor predeterminado ha sido elegido por razones históricas y difiere del R actual predeterminado_ ". Así que modifiqué mis run_tests.R para usar: 'rngKind =" Mersenne-Twister ", rngNormalKind =" Inversion "' ¡y mis pruebas ahora pasan! –

+0

+1 No sabía sobre esto, sin embargo, una decisión extraña. – Hansi