ÎncepețiÎncepe gratuit

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

Vezi cursul

Instrucțiuni pentru exercițiu

  • Specifică valoarea returnată, out, ca vector numeric de dimensiune n.
  • Citește codul buclei pentru a înțelege ce face fiecare parte.
  • Generează un număr aleator normal cu media mean și deviația standard sd, atribuindu-l lui out[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)
*/
Editează și rulează codul