Generación de números aleatorios escalares
Cuando escribes código en R, normalmente tiene sentido generar números aleatorios de forma vectorizada. Sin embargo, en C++ puedes (y tu conciencia no te lo reprochará) usar bucles y procesar los datos elemento a elemento.
La API de R te ofrece funciones para generar un número aleatorio de una de las distribuciones habituales, y Rcpp hace que estas funciones sean accesibles en el espacio de nombres R::. Por ejemplo, R::rnorm(2, 3) te da un número aleatorio de la distribución normal con media 2 y desviación estándar 3. Observa que el argumento n de la versión "real" de rnorm() no está presente. La versión de Rcpp siempre devuelve un único número.
Adelante, completa la definición de la función positive_rnorm().
Nota: Este último capítulo es difícil, así que no te desanimes si no logras completar los ejercicios al primer intento. Recuerda la recompensa por terminar este curso: ¡mejorar drásticamente el rendimiento de tu código en R!
Este ejercicio forma parte del curso
Optimizar código de R con Rcpp
Instrucciones del ejercicio
- Especifica el valor de retorno,
out, como un vector numérico de tamañon. - Lee el código del bucle para ver qué hace cada parte.
- Genera un número aleatorio normal con media
meany desviación estándarsd, asignándolo aout[i]. - Mientras
out[i]sea menor o igual que cero, vuelve a intentarlo.
Ejercicio interactivo práctico
Prueba este ejercicio y completa el código de muestra.
#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)
*/