2012-08-15 32 views
9

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 

Trả lời

13

Có vẻ như bạn đang sử dụng gói RUnit cho các bài kiểm tra đơn vị của mình. Trong trường hợp này, bạn cần lưu ý rằng RUnit sử dụng một giá trị mặc định khác cho loại của trình tạo số ngẫu nhiên (RNGkind).

Từ RUnit manual, và sự giúp đỡ cho ?defineTestSuite:

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

Chú ý rằng mặc định rngKind trong RUnit"Marsaglia-Multicarry".

Tuy nhiên, trong cơ sở R, mặc định RNGkind"Mersenne-Twister". Từ ?RNGkind:

Các loại RNG hiện có sẵn được đưa ra bên dưới. loại là một phần phù hợp với danh sách này. Mặc định là "Mersenne-Twister".


Vì vậy, để phù hợp với kết quả tương tác của bạn với kết quả của RUnit, bạn cần phải thiết lập một khác nhau RNGkind, hoặc trong phiên tương tác của bạn hoặc trong cuộc gọi ban đầu của bạn để defineTestSuite.

+0

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! –

+0

+1 Không biết về điều này, quyết định kỳ lạ mặc dù. – Hansi

Các vấn đề liên quan