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
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! –
+1 No sabía sobre esto, sin embargo, una decisión extraña. – Hansi