MulaiMulai sekarang secara gratis

Pembangkit bilangan acak skalar

Saat Anda menulis kode R, biasanya masuk akal untuk menghasilkan bilangan acak secara vektorisasi. Namun, ketika Anda berada di C++, Anda diperbolehkan (bahkan oleh suara hati Anda) untuk menggunakan loop dan memroses data satu per satu elemen.

API R menyediakan fungsi untuk menghasilkan bilangan acak dari salah satu sebaran umum, dan Rcpp membuat fungsi-fungsi ini dapat diakses dalam namespace R::. Misalnya, R::rnorm(2, 3) memberi Anda satu bilangan acak dari sebaran Normal dengan mean 2 dan simpangan baku 3. Perhatikan bahwa argumen n dari rnorm() "asli" tidak ada. Versi Rcpp selalu mengembalikan satu angka.

Silakan lengkapi definisi fungsi positive_rnorm().

Catatan: Bab terakhir ini cukup menantang, jadi jangan berkecil hati jika Anda belum dapat menyelesaikan latihan pada percobaan pertama. Ingat imbalan setelah menyelesaikan kursus ini: peningkatan kinerja kode R Anda secara drastis!

Latihan ini adalah bagian dari kursus

Mengoptimalkan Kode R dengan Rcpp

Lihat Kursus

Petunjuk latihan

  • Tentukan nilai kembalian, out, sebagai vektor numerik berukuran n.
  • Baca kode perulangan untuk melihat apa yang dilakukan masing-masing.
  • Hasilkan satu bilangan acak bersebaran normal dengan mean mean dan simpangan baku sd, lalu tetapkan ke out[i].
  • Selama out[i] kurang dari atau sama dengan nol, coba lagi.

Latihan interaktif praktis

Cobalah latihan ini dengan menyelesaikan kode contoh berikut.

#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)
*/
Edit dan Jalankan Kode