스칼라 난수 생성
R 코드에서는 보통 벡터화 방식으로 난수를 생성하는 것이 합리적입니다. 하지만 C++에서는 양심의 가책 없이 루프를 사용해 데이터를 요소별로 처리할 수 있습니다.
R API는 흔히 쓰는 분포에서 난수를 생성하는 함수를 제공하며, Rcpp는 이를 R:: 네임스페이스를 통해 사용할 수 있게 합니다. 예를 들어, R::rnorm(2, 3)은 평균이 2, 표준편차가 3인 정규분포에서 난수 하나를 반환합니다. "진짜" rnorm()의 n 인자가 없다는 점에 주의하세요. Rcpp 버전은 항상 숫자 하나만 반환합니다.
이제 positive_rnorm()의 함수 정의를 완성해 보세요.
참고: 마지막 장은 난이도가 높습니다. 처음에 연습 문제를 모두 풀지 못하더라도 낙담하지 마세요. 이 과정을 마치면 R 코드의 성능을 놀랄 만큼 향상시킬 수 있습니다!
이 연습은 강의의 일부입니다
Rcpp로 R 코드 최적화하기
연습 안내
- 반환값
out을 크기가n인 숫자형 벡터로 지정하세요. - 각 루프가 무엇을 하는지 코드를 읽어 보세요.
- 평균이
mean, 표준편차가sd인 정규 난수를 생성해out[i]에 할당하세요. out[i]가 0 이하인 동안에는 다시 시도하세요.
실습형 인터랙티브 연습
이 예제를 이 샘플 코드를 완성하여 풀어보세요.
#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)
*/