Generering av slumptal för skalärer
När du skriver R-kod är det oftast naturligt att generera slumptal på ett vektoriserat sätt. I C++ däremot får du gärna använda loopar och bearbeta data element för element – det finns inget att skämmas för.
R:s API erbjuder funktioner för att generera ett slumptal från någon av de vanliga fördelningarna, och Rcpp gör dessa tillgängliga i namnrymden R::. Till exempel ger R::rnorm(2, 3) ett slumptal från normalfördelningen med medelvärde 2 och standardavvikelse 3. Observera att argumentet n från den "riktiga" rnorm() saknas här. Rcpp-versionen returnerar alltid ett enda tal.
Fulföll nu funktionsdefinitionen för positive_rnorm().
Obs: Det här sista kapitlet är krävande, så ge inte upp om du inte lyckas lösa övningarna på första försöket. Kom ihåg vad du får ut av kursen: dramatiskt förbättrad prestanda i din R-kod!
Den här övningen är en del av kursen
Optimera R-kod med Rcpp
Övningsinstruktioner
- Ange returvärdet
outsom en numerisk vektor av storlekenn. - Läs igenom loopkoden för att förstå vad varje del gör.
- Generera ett normalfördelat slumptal med medelvärde
meanoch standardavvikelsesd, och tilldela resultatet tillout[i]. - Så länge
out[i]är mindre än eller lika med noll, försök igen.
Interaktiv övning med praktiskt arbete
Testa den här övningen genom att slutföra den här exempelkoden.
#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)
*/