Bắt đầu ngayBắt đầu miễn phí

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

Xem khóa học

Hướng dẫn bài tập

  • Khai báo giá trị trả về out là một numeric vector có kích thước n.
  • Đọ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 mean và độ lệch chuẩn sd, gán vào out[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)
*/
Chỉnh sửa và Chạy Mã