Generowanie skalarnych liczb losowych
Pisząc kod w R, zazwyczaj generujemy liczby losowe w sposób wektorowy. W C++ możesz jednak – bez wyrzutów sumienia – swobodnie korzystać z pętli i przetwarzać dane element po elemencie.
API R udostępnia funkcje do generowania pojedynczych liczb losowych z popularnych rozkładów, a Rcpp umożliwia korzystanie z nich za pośrednictwem przestrzeni nazw R::. Na przykład R::rnorm(2, 3) zwraca jedną liczbę losową z rozkładu normalnego o średniej 2 i odchyleniu standardowym 3. Zwróć uwagę, że argument n znany z "prawdziwej" funkcji rnorm() tutaj nie występuje – wersja Rcpp zawsze zwraca dokładnie jedną liczbę.
Uzupełnij definicję funkcji positive_rnorm().
Uwaga: Ten ostatni rozdział jest wymagający – nie zniechęcaj się, jeśli nie uda ci się ukończyć ćwiczeń za pierwszym razem. Pamiętaj, co czeka na końcu tego kursu: znaczące przyspieszenie działania twojego kodu w R!
To ćwiczenie jest częścią kursu
Optymalizacja kodu R za pomocą Rcpp
Instrukcje do ćwiczenia
- Zdefiniuj wartość zwracaną
outjako wektor liczbowy o rozmiarzen. - Przeanalizuj kod pętli, aby zrozumieć, co robi każda jej część.
- Wygeneruj losową liczbę z rozkładu normalnego o średniej
meani odchyleniu standardowymsd, przypisując ją doout[i]. - Dopóki
out[i]jest mniejsze lub równe zero, powtarzaj losowanie.
Interaktywne ćwiczenie praktyczne
Spróbuj tego ćwiczenia, uzupełniając ten przykładowy kod.
#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)
*/