Tạo số ngẫu nhiên

Tối ưu hóa mã R với Rcpp

Romain François

Consulting Datactive, ThinkR

Tạo từng số ngẫu nhiên

// một số từ N(0,1)
double x = R::rnorm( 0, 1 ) ;

// một số từ U(-2,2)
double y = R::runif( -2, 2 ) ;

// ...
Tối ưu hóa mã R với Rcpp

Tạo vector

Bộ tạo số ngẫu nhiên trong không gian tên Rcpp::.

NumericVector x = rnorm(10, 0, 2) ;
// giống như bên dưới
// vì có using namespace Rcpp ;
// 
// NumericVector x = Rcpp::rnorm(10, 0, 2) ;

Cách khác: dùng phiên bản vô hướng từ R::

// tương đương
NumericVector x(10) ; 
for(int i=0; i<10; i++){
    x[i] = R::rnorm(0, 2) ;
}
Tối ưu hóa mã R với Rcpp

Tối ưu hóa mã R với Rcpp

Lấy mẫu loại bỏ (rejection sampling)

// tạo n số
NumericVector x(n) ;

// điền vector trong vòng lặp
for( int i=0; i<n; i++){
    // tiếp tục tạo d cho đến khi d dương
    double d  ;
    do {
        d = ... ;
    } while( d < 0 ) ;

    x[i] = d ;    
}
Tối ưu hóa mã R với Rcpp

Tối ưu hóa mã R với Rcpp
  • Chọn thành phần của hỗn hợp theo trọng số
int component( NumericVector weights, double total_weight ){
    // trả về chỉ số của thành phần được chọn}
  • Tạo số dùng tham số của thành phần đã chọn
NumericVector rmix( int n, NumericVector weights, NumericVector means, 
                    NumericVector sds ){
    NumericVector res(n) ;    
    for( int i=0; i<n; i++){
        // tìm thành phần sẽ dùng
        ...        
        // mô phỏng với mean và sd của thành phần đã chọn
        ...    }    
    return res ;
}
Tối ưu hóa mã R với Rcpp

Cùng luyện tập nào!

Tối ưu hóa mã R với Rcpp

Preparing Video For Download...