Generowanie liczb losowych

Optymalizacja kodu R za pomocą Rcpp

Romain François

Consulting Datactive, ThinkR

Generowanie pojedynczych liczb losowych

// one number from a N(0,1)
double x = R::rnorm( 0, 1 ) ;

// one number from a U(-2,2)
double y = R::runif( -2, 2 ) ;

// ...
Optymalizacja kodu R za pomocą Rcpp

Generowanie wektorów

Generatory liczb losowych w przestrzeni nazw Rcpp::.

NumericVector x = rnorm(10, 0, 2) ;
// same as this below
// because of using namespace Rcpp ;
// 
// NumericVector x = Rcpp::rnorm(10, 0, 2) ;

Alternatywnie, używając skalarnych wersji z R::

// same as 
NumericVector x(10) ; 
for(int i=0; i<10; i++){
    x[i] = R::rnorm(0, 2) ;
}
Optymalizacja kodu R za pomocą Rcpp

Optymalizacja kodu R za pomocą Rcpp

Próbkowanie przez odrzucenie

// we generate n numbers
NumericVector x(n) ;

// fill the vector in a loop
for( int i=0; i<n; i++){
    // keep generating d until it gets positive
    double d  ;
    do {
        d = ... ;
    } while( d < 0 ) ;

    x[i] = d ;    
}
Optymalizacja kodu R za pomocą Rcpp

Optymalizacja kodu R za pomocą Rcpp
  • Wybierz składnik mieszaniny na podstawie wag
int component( NumericVector weights, double total_weight ){
    // return the index of the selected component}
  • Wygeneruj liczbę, używając parametrów wybranego składnika
NumericVector rmix( int n, NumericVector weights, NumericVector means, 
                    NumericVector sds ){
    NumericVector res(n) ;    
    for( int i=0; i<n; i++){
        // find which component to use
        ...        
        // simulate using the mean and sd from the selected component
        ...    }    
    return res ;
}
Optymalizacja kodu R za pomocą Rcpp

Czas na ćwiczenia!

Optymalizacja kodu R za pomocą Rcpp

Preparing Video For Download...