Génération de nombres aléatoires scalaires
Quand vous codez en R, il est généralement préférable de générer des nombres aléatoires de manière vectorisée. En C++ en revanche, vous pouvez sans problème 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) renvoie 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 renvoie toujours un seul nombre.
Allez-y et complétez la définition de la fonction positive_rnorm().
Remarque : Ce dernier chapitre est exigeant, donc ne vous découragez pas si vous n’arrivez pas à finir les exercices du premier coup. Souvenez-vous de la récompense à la clé : améliorer radicalement les performances de votre code R !
Cet exercice fait partie du cours
Optimiser du code R avec Rcpp
Instructions
- Spécifiez la valeur de retour
outcomme un vecteur numérique de taillen. - Lisez le code de boucle pour comprendre le rôle de chaque partie.
- Générez un nombre aléatoire normal de moyenne
meanet d’écart typesd, et affectez-le àout[i]. - Tant que
out[i]est inférieur ou égal à zéro, réessayez.
Exercice interactif pratique
Essayez cet exercice en complétant cet exemple de code.
#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)
*/