Kom igångKom igång gratis

Generering av slumptal för skalärer

När du skriver R-kod är det oftast naturligt att generera slumptal på ett vektoriserat sätt. I C++ däremot får du gärna använda loopar och bearbeta data element för element – det finns inget att skämmas för.

R:s API erbjuder funktioner för att generera ett slumptal från någon av de vanliga fördelningarna, och Rcpp gör dessa tillgängliga i namnrymden R::. Till exempel ger R::rnorm(2, 3) ett slumptal från normalfördelningen med medelvärde 2 och standardavvikelse 3. Observera att argumentet n från den "riktiga" rnorm() saknas här. Rcpp-versionen returnerar alltid ett enda tal.

Fulföll nu funktionsdefinitionen för positive_rnorm().

Obs: Det här sista kapitlet är krävande, så ge inte upp om du inte lyckas lösa övningarna på första försöket. Kom ihåg vad du får ut av kursen: dramatiskt förbättrad prestanda i din R-kod!

Den här övningen är en del av kursen

Optimera R-kod med Rcpp

Visa kurs

Övningsinstruktioner

  • Ange returvärdet out som en numerisk vektor av storleken n.
  • Läs igenom loopkoden för att förstå vad varje del gör.
  • Generera ett normalfördelat slumptal med medelvärde mean och standardavvikelse sd, och tilldela resultatet till out[i].
  • Så länge out[i] är mindre än eller lika med noll, försök igen.

Interaktiv övning med praktiskt arbete

Testa den här övningen genom att slutföra den här exempelkoden.

#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)
*/
Redigera och kör kod