CommencezCommencez gratuitement

Génération de nombres aléatoires scalaires

Quand vous écrivez du code R, il est généralement judicieux de générer des nombres aléatoires de façon vectorisée. En C++ toutefois, vous pouvez sans remords utiliser des boucles et traiter les données élément par élément.

L'API de R fournit des fonctions pour générer un nombre aléatoire selon l'une des distributions usuelles, et Rcpp rend ces fonctions accessibles dans l'espace de noms R::. Par exemple, R::rnorm(2, 3) vous donne un nombre aléatoire provenant d'une loi normale de moyenne 2 et d'écart-type 3. Remarquez que l'argument n de la « vraie » fonction rnorm() n'est pas présent. La version Rcpp retourne toujours un seul nombre.

Allez-y et terminez la définition de la fonction positive_rnorm().

Remarque : Ce dernier chapitre est exigeant, alors ne vous découragez pas si vous n'arrivez pas à faire les exercices du premier coup. Gardez en tête la récompense à la clé : améliorer de façon spectaculaire la performance de votre code R !

Cette activité fait partie du cours

Optimiser le code R avec Rcpp

Voir le cours

Instructions de l’exercice

  • Indiquez la valeur de retour, out, comme un vecteur numérique de taille n.
  • Lisez le code de bouclage pour voir ce que fait chaque élément.
  • Générez un nombre aléatoire normal de moyenne mean et d'écart-type sd, et l'assigner à out[i].
  • Tant que out[i] est inférieur ou égal à zéro, réessayez.

Exercice interactif pratique

Essayez cet exercice en complétant ce code d’exemple.

#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)
*/
Modifier et exécuter le code