标量随机数生成
在 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)
*/