LoslegenKostenlos loslegen

Skalare Zufallszahlenerzeugung

Wenn du R-Code schreibst, ist es in der Regel sinnvoll, Zufallszahlen vektorisiert zu erzeugen. In C++ hingegen darfst du (sogar mit gutem Gewissen) Schleifen verwenden und die Daten Element für Element verarbeiten.

Die R-API stellt dir Funktionen zur Verfügung, um eine Zufallszahl aus einer der üblichen Verteilungen zu erzeugen, und Rcpp macht diese Funktionen im R::-Namensraum zugänglich. Zum Beispiel liefert R::rnorm(2, 3) eine Zufallszahl aus der Normalverteilung mit Mittelwert 2 und Standardabweichung 3. Beachte, dass das Argument n der „echten“ rnorm() hier nicht vorhanden ist. Die Rcpp-Version gibt immer genau eine Zahl zurück.

Vervollständige nun die Funktionsdefinition von positive_rnorm().

Hinweis: Dieses letzte Kapitel ist anspruchsvoll. Lass dich nicht entmutigen, wenn du die Aufgaben nicht gleich beim ersten Versuch schaffst. Denk an die Belohnung, wenn du diesen Kurs abschließt: die Leistung deines R-Codes spürbar steigern!

Diese Übung ist Teil des Kurses

R-Code mit Rcpp optimieren

Kurs anzeigen

Anleitung zur Übung

  • Lege den Rückgabewert out als numerischen Vektor der Größe n fest.
  • Lies dir den Schleifencode durch, um zu verstehen, was jeder Teil macht.
  • Erzeuge eine normalverteilte Zufallszahl mit Mittelwert mean und Standardabweichung sd und weise sie out[i] zu.
  • Solange out[i] kleiner oder gleich null ist, versuche es erneut.

Interaktive Übung

Vervollständige den Beispielcode, um diese Übung erfolgreich abzuschließen.

#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 bearbeiten und ausführen