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
Petunjuk latihan
- Tentukan nilai kembalian,
out, sebagai vektor numerik berukurann. - Baca kode perulangan untuk melihat apa yang dilakukan masing-masing.
- Hasilkan satu bilangan acak bersebaran normal dengan mean
meandan simpangan bakusd, lalu tetapkan keout[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)
*/