开始使用免费开始使用

标量随机数生成

在 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)
*/
编辑并运行代码