Generarea de numere aleatoare scalare
Când scrii cod R, de obicei are sens să generezi numere aleatoare în mod vectorizat. În C++ însă, ești liber (chiar și cu conștiința curată) să folosești bucle și să procesezi datele element cu element.
API-ul R îți oferă funcții pentru a genera un număr aleator dintr-una dintre distribuțiile uzuale, iar Rcpp face aceste funcții accesibile în namespace-ul R::. De exemplu, R::rnorm(2, 3) îți returnează un singur număr aleator din distribuția normală cu media 2 și deviația standard 3. Observă că argumentul n din versiunea „reală" rnorm() nu este prezent. Versiunea Rcpp returnează întotdeauna un singur număr.
Completează definiția funcției positive_rnorm().
Notă: Acest ultim capitol este dificil, așa că nu te descuraja dacă nu reușești să rezolvi exercițiile din prima încercare. Gândește-te la recompensă: îmbunătățirea dramatică a performanței codului tău R!
Acest exercițiu face parte din cursul
Optimizarea codului R cu Rcpp
Instrucțiuni pentru exercițiu
- Specifică valoarea returnată,
out, ca vector numeric de dimensiunen. - Citește codul buclei pentru a înțelege ce face fiecare parte.
- Generează un număr aleator normal cu media
meanși deviația standardsd, atribuindu-l luiout[i]. - Cât timp
out[i]este mai mic sau egal cu zero, încearcă din nou.
Exercițiu interactiv practic
Încearcă acest exercițiu completând acest cod de exemplu.
#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)
*/