Trong một thử nghiệm đơn vị tôi bắt đầu một hàm helper (tạo ra dữ liệu thử nghiệm) với:Tại sao RUnit thay đổi số ngẫu nhiên của tôi?
set.seed(1)
tôi đã phát triển các đơn vị kiểm tra tương tác như thế này:
source('tests/runit.functions.R');test.something()
Nhưng sau đó khi tôi đã đi để chạy kiểm tra từ số run_tests.R
của chúng không thành công. Tôi thu hẹp nó xuống các số ngẫu nhiên khác nhau, mặc dù lệnh set.seed(1)
! Tôi đã thêm dòng này, ngay sau khi set.seed (1):
print(sessionInfo());print("RANDOM SEED:");print(.Random.seed)
Phần thực sự thú vị là hạt giống ngẫu nhiên hoàn toàn khác. Trong kịch bản hàng loạt nó chỉ là ba số:
501 1280795612 -169270483
Trong khi ở phiên R tương tác của tôi nó là một con quái vật 626 phần tử:
[1] 403 624 -169270483 -442010614 ...
...
[617] 197184543 -2095148 ... -689249108
Con số đầu tiên, 501 vs 403, là loại trình tạo số ngẫu nhiên, rõ ràng, nhưng tôi không thể theo dõi danh sách chính về ý nghĩa của các con số.
Tôi nghĩ cốt lõi của câu hỏi của tôi là cách tốt nhất để đảm bảo các thử nghiệm đơn vị của tôi có thế hệ số ngẫu nhiên đáng tin cậy là gì? Câu hỏi thứ hai là lời khuyên khắc phục sự cố: làm thế nào để tôi theo dõi trình tạo số ngẫu nhiên nào đang được sử dụng (và quan trọng hơn) mã/gói/thiết lập nào đã quyết định sử dụng?
sessionInfo
không có vẻ rất hữu ích, nhưng nó hiển thị một số khác biệt nhỏ. Ví dụ. sự bao gồm của gói TTR là do các bài kiểm tra đơn vị khác đang chạy. Dưới đây là sessionInfo
đầu ra từ các tập lệnh batch, nơi dòng đầu tiên là #!/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
Và đây là kết quả từ phiên của tôi tương tác R, được bắt đầu từ dòng lệnh với 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
Tuyệt vời, cảm ơn. Từ sự trợ giúp 'defineTestSuite' nó nói:" _this mặc định này đã được chọn vì lý do lịch sử và khác với R default_ hiện tại ". Vì vậy, tôi đã thay đổi run_tests.R của tôi để sử dụng: 'rngKind =" Mersenne-Twister ", rngNormalKind =" Inversion "' và các bài kiểm tra của tôi bây giờ vượt qua! –
+1 Không biết về điều này, quyết định kỳ lạ mặc dù. – Hansi