Sinh số ngẫu nhiên vô hướng
Khi viết mã R, thường hợp lý hơn là sinh số ngẫu nhiên theo kiểu vector hóa. Tuy nhiên, với C++, bạn hoàn toàn có thể (và lương tâm vẫn yên ổn) dùng vòng lặp để xử lý dữ liệu từng phần tử.
R API cung cấp các hàm sinh số ngẫu nhiên từ những phân phối quen thuộc, và Rcpp giúp bạn truy cập các hàm này trong không gian tên R::. Ví dụ, R::rnorm(2, 3) trả về một số ngẫu nhiên từ phân phối Chuẩn với kỳ vọng 2 và độ lệch chuẩn 3. Lưu ý đối số n của rnorm() “thật” không xuất hiện ở đây. Phiên bản Rcpp luôn trả về đúng một số.
Hãy hoàn thiện định nghĩa hàm positive_rnorm().
Lưu ý: Chương cuối cùng này khó, nên đừng nản nếu bạn chưa hoàn thành bài ngay lần đầu. Hãy nhớ phần thưởng khi bạn hoàn tất khóa học: tăng tốc hiệu năng mã R của bạn một cách ấn tượng!
Bài tập này là một phần của khóa học
Tối ưu hóa mã R với Rcpp
Hướng dẫn bài tập
- Khai báo giá trị trả về
outlà một numeric vector có kích thướcn. - Đọc mã vòng lặp để hiểu từng phần làm gì.
- Sinh một số ngẫu nhiên phân phối chuẩn với kỳ vọng
meanvà độ lệch chuẩnsd, gán vàoout[i]. - Trong khi
out[i]nhỏ hơn hoặc bằng 0, hãy thử lại.
Bài tập tương tác thực hành trực tiếp
Hãy thử làm bài tập này bằng cách hoàn thành đoạn mã mẫu này.
#include
using namespace Rcpp;
// [[Rcpp::export]]
NumericVector positive_rnorm(int n, double mean, double sd) {
// Specify out as a numeric vector of size n
___ ___(___);
// This loops over the elements of out
for(int i = 0; i < n; i++) {
// This loop keeps trying to generate a value
do {
// Call R's rnorm()
out[i] = ___;
// While the number is negative, keep trying
} while(___);
}
return out;
}
/*** R
positive_rnorm(10, 2, 2)
*/