IniziaInizia gratis

Generazione di numeri casuali scalari

Quando scrivi codice R, di solito ha senso generare numeri casuali in modo vettoriale. In C++ però, sei autorizzato (anche dalla tua coscienza) a usare i cicli e a elaborare i dati elemento per elemento.

L'API di R ti fornisce funzioni per generare un numero casuale da una delle distribuzioni più comuni, e Rcpp rende queste funzioni accessibili nello spazio dei nomi R::. Per esempio, R::rnorm(2, 3) restituisce un numero casuale dalla distribuzione Normale con media 2 e deviazione standard 3. Nota che l'argomento n della "vera" rnorm() non è presente. La versione Rcpp restituisce sempre un solo numero.

Procedi e completa la definizione della funzione positive_rnorm().

Nota: Questo ultimo capitolo è impegnativo, quindi non scoraggiarti se non riesci a completare gli esercizi al primo tentativo. Ricorda la ricompensa per aver completato questo corso: migliorare drasticamente le prestazioni del tuo codice R!

Questo esercizio fa parte del corso

Ottimizzare il codice R con Rcpp

Visualizza il corso

Istruzioni dell'esercizio

  • Specifica il valore di ritorno, out, come vettore numerico di dimensione n.
  • Leggi il codice con i cicli per capire cosa fa ciascuno.
  • Genera un numero casuale normale con media mean e deviazione standard sd, assegnandolo a out[i].
  • Finché out[i] è minore o uguale a zero, riprova.

Esercizio pratico interattivo

Prova a risolvere questo esercizio completando il codice di esempio.

#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)
*/
Modifica ed esegui il codice