Začněte nyníZačněte zdarma

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

Zobrazit kurz

Pokyny k cvičení

  • Definuj návratovou hodnotu out jako numerický vektor o velikosti n.
  • 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 mean a směrodatnou odchylkou sd a přiřaď ho do out[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)
*/
Upravit a spustit kód