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
Istruzioni dell'esercizio
- Specifica il valore di ritorno,
out, come vettore numerico di dimensionen. - Leggi il codice con i cicli per capire cosa fa ciascuno.
- Genera un numero casuale normale con media
meane deviazione standardsd, assegnandolo aout[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)
*/