2015-05-26 36 views
5

Câu hỏi của tôi là theo dõi http://rcpp-devel.r-forge.r-project.narkive.com/qJMEsvOK/setting-the-r-random-seed-from-rcpp.Rcpp đặt trạng thái RNG thành trạng thái trước đây

Tôi muốn có thể đặt trạng thái RNG thành trạng thái cũ từ trong C++. Ví dụ, tôi muốn đoạn mã sau để tạo ra một ma trận trong đó mỗi cột chứa cùng một sự thực hiện các biến ngẫu nhiên Gamma.

cppFunction('NumericMatrix rgamma_reset_seed(int n, double shape, double rate){ 
      RNGScope rngscope; 
      Environment g = Environment::global_env(); 
      Environment::Binding RandomSeed = g[".Random.seed"]; 
      IntegerVector someVariable = RandomSeed; 
      NumericMatrix results(n, 2); 
      results(_,0) = rgamma(n, shape, 1/rate); 
      RandomSeed = someVariable; 
      results(_,1) = rgamma(n, shape, 1/rate); 
      return results; 
}') 
m <- rgamma_reset_seed(1000, 1.2, 0.8) 
par(mfrow = c(2, 1)) 
plot(m[,1]) 
plot(m[,2]) 

Nhưng có vẻ như nó không hoạt động. Trong R, tôi có thể đạt được kết quả theo các dòng như

.Random.seed <- x # reset the state to x 
x <- .Random.seed # store the current state 

Tôi có thiếu thứ gì đó hiển nhiên không? Bất kì sự trợ giúp nào đều được đánh giá cao!

Trả lời

3

Điều này có thể không hoạt động (dễ dàng) - có một số ngôn ngữ trong phần mở rộng Viết R cho biết bạn không thể đặt hạt giống từ API cấp C.

Bây giờ, bạn có thể gian lận:

  1. Init RNG từ R
  2. làm một số công việc, đảm bảo điều này được bao bọc bởi RNGScope như mã của chúng tôi không anyway.
  3. Bây giờ hãy ăn gian và sử dụng Rcpp::Function() để gọi set.seed().
  4. Cân nhắc xem có quay trở lại bước 2 hoặc kết thúc hay không.
+0

Cảm ơn sự giúp đỡ của bạn. Vấn đề là tôi muốn làm điều đó nhiều lần từ bên trong mã Rcpp, vì vậy tôi sẽ không biết giá trị nào cần sử dụng trong cuộc gọi 'set.seed' mà không có" đọc nó "bằng cách nào đó từ' .Random.seed'. Dường như nó sẽ dễ dàng hơn để mã thuật toán của tôi trong R với ít khi gọi hàm Rcpp, để tôi có thể sao chép và khôi phục biến '.Random.seed' từ bên trong R. Tôi có đúng không? –

+0

Tôi thực sự không biết. Có lẽ bạn muốn xem xét sử dụng một động cơ RNG khác nhau? Rất nhiều sự đánh đổi ở đây. –

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