ComenzarEmpieza gratis

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

Ver curso

Instrucciones del ejercicio

  • Especifica el valor de retorno, out, como un vector numérico de tamaño n.
  • Lee el código del bucle para ver qué hace cada parte.
  • Genera un número aleatorio normal con media mean y desviación estándar sd, asignándolo a out[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)
*/
Editar y ejecutar código