시작하기무료로 시작하기

스칼라 난수 생성

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)
*/
코드 편집 및 실행