Zacznij terazZacznij za darmo

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

Zobacz kurs

Instrukcje do ćwiczenia

  • Zdefiniuj wartość zwracaną out jako wektor liczbowy o rozmiarze n.
  • Przeanalizuj kod pętli, aby zrozumieć, co robi każda jej część.
  • Wygeneruj losową liczbę z rozkładu normalnego o średniej mean i odchyleniu standardowym sd, przypisując ją do out[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)
*/
Edytuj i uruchom kod