Generování skalárních náhodných čísel
Při psaní R kódu obvykle dává smysl generovat náhodná čísla vektorizovaně. V C++ si ale můžeš (a bez výčitek svědomí) dovolit použít smyčky a zpracovávat data po jednom prvku.
R API ti poskytuje funkce pro generování náhodného čísla z běžných rozdělení a Rcpp je zpřístupňuje v jmenném prostoru R::. Například R::rnorm(2, 3) vrátí jedno náhodné číslo z normálního rozdělení se střední hodnotou 2 a směrodatnou odchylkou 3. Všimni si, že argument n ze „skutečné" funkce rnorm() zde chybí — verze pro Rcpp vždy vrací právě jedno číslo.
Dokončete definici funkce positive_rnorm().
Poznámka: Tato závěrečná kapitola je náročná, takže se nenech odradit, pokud se ti cvičení nepodaří hned napoprvé. Pamatuj, jaká odměna tě čeká po dokončení kurzu: výrazné zrychlení tvého R kódu!
Toto cvičení je součástí kurzu
Optimizing R Code with Rcpp
Pokyny k cvičení
- Definuj návratovou hodnotu
outjako numerický vektor o velikostin. - Projdi si kód smyčky a zjisti, co která část dělá.
- Vygeneruj náhodné číslo z normálního rozdělení se střední hodnotou
meana směrodatnou odchylkousda přiřaď ho doout[i]. - Pokud je
out[i]menší nebo rovno nule, zopakuj generování.
Interaktivní cvičení na vyzkoušení si v praxi
Vyzkoušejte si toto cvičení dokončením tohoto ukázkového kódu.
#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)
*/