Aan de slagGa gratis aan de slag

Scalaire generatie van willekeurige getallen

Als je R-code schrijft, is het meestal logisch om willekeurige getallen gevectoriseerd te genereren. In C++ mag je echter (zelfs van je schuldige geweten) lussen gebruiken en de gegevens element voor element verwerken.

De R-API geeft je functies om een willekeurig getal te genereren uit een van de gebruikelijke verdelingen, en Rcpp maakt deze functies toegankelijk in de R::-namespace. Zo geeft R::rnorm(2, 3) je één willekeurig getal uit de normale verdeling met gemiddelde 2 en standaardafwijking 3. Merk op dat het argument n uit de “echte” rnorm() ontbreekt. De Rcpp-versie retourneert altijd één getal.

Ga aan de slag en maak de functiedefinitie van positive_rnorm() af.

Let op: Dit laatste hoofdstuk is pittig, dus raak niet ontmoedigd als het niet in één keer lukt. Denk aan de beloning als je deze cursus afrondt: de prestaties van je R-code dramatisch verbeteren!

Deze oefening maakt deel uit van de cursus

R-code optimaliseren met Rcpp

Cursus bekijken

Oefeninstructies

  • Specificeer de geretourneerde waarde out als een numerieke vector van grootte n.
  • Lees de luscode om te zien wat elk deel doet.
  • Genereer een normaal willekeurig getal met gemiddelde mean en standaardafwijking sd, en ken dit toe aan out[i].
  • Terwijl out[i] kleiner dan of gelijk aan nul is, probeer je het opnieuw.

Praktische interactieve oefening

Probeer deze oefening eens door deze voorbeeldcode in te vullen.

#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)
*/
Code bewerken en uitvoeren