始める無料で始める

スカラーの乱数生成

R でコードを書くときは、通常はベクトル化して乱数を生成するのが理にかなっています。一方で C++ では、ループを使ってデータを要素ごとに処理しても問題ありません(良心の呵責すら許してくれます)。

R の API には、よく使われる分布から乱数を1つ生成する関数が用意されており、Rcpp を使うとこれらの関数に R:: 名前空間からアクセスできます。例えば、R::rnorm(2, 3) は平均 2、標準偏差 3 の正規分布から乱数を1つ返します。「本家」の rnorm() にある引数 n は存在しない点に注意してください。Rcpp 版は常に1つの数だけを返します。

それでは、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)
*/
コードを編集して実行