r - R 复制()函数不适用于 Rcpp 函数
问题描述
我在使用replicate()
R 中的函数通过 Rcpp 函数生成随机数时遇到问题。考虑 R 中的以下函数:
trial <- function(){rnorm(1)}
replicate(10, trial())
它从高斯分布中生成 10 个随机数。它工作得很好,并产生如下结果:
[1] 0.7609912 -0.2949613 1.8684363 -0.3358377 -1.6043926 0.2706250 0.5528813 1.0228125 -0.2419092 -1.4761937
但是,我有一个getRan()
从高斯分布生成随机数的 c++ 函数。我再次使用复制来调用这样的函数:
replicate(10,getRan())
它创建一个相同数字的向量,如下所示:
> replicate(10,getRan())
[1] -1.374932 -1.374932 -1.374932 -1.374932 -1.374932 -1.374932 -1.374932 -1.374932 -1.374932 -1.374932
> replicate(10,getRan())
[1] -0.3273785 -0.3273785 -0.3273785 -0.3273785 -0.3273785 -0.3273785 -0.3273785 -0.3273785 -0.3273785 -0.3273785
> replicate(10,getRan())
[1] -0.7591953 -0.7591953 -0.7591953 -0.7591953 -0.7591953 -0.7591953 -0.7591953 -0.7591953 -0.7591953 -0.7591953
> replicate(10,getRan())
[1] -1.698935 -1.698935 -1.698935 -1.698935 -1.698935 -1.698935 -1.698935 -1.698935 -1.698935 -1.698935
但是,如果我多次调用该函数,它工作正常:
getRan()
[1] 1.345227
> getRan()
[1] 0.3555393
> getRan()
[1] 1.587241
> getRan()
[1] 0.5313518
那么这里的问题是什么?该函数是否replicate()
重复相同的函数返回getRan()
而不是getRan()
多次调用?它是一个错误吗?
PS:我知道我可以rnorm(n)
用来生成n个正常的随机数,但是,我想使用c++函数根据生成随机数进行更复杂的计算
PPS:这是我的 C++ 代码:
double getRan(){
unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
std::default_random_engine generator(seed);
std::normal_distribution<double> distribution (0.0,1.0);
double epi = distribution(generator);
return epi;
}
解决方案
这是一个反例,表明它工作得很好:
代码
trialR <- function() { rnorm(1) }
Rcpp::cppFunction("double trialC() { return R::rnorm(0.0, 1.0); }")
Rcpp::cppFunction("Rcpp::NumericVector trialSugar() { return Rcpp::rnorm(1.0, 0.0, 1.0); }")
set.seed(123); replicate(3, trialR())
set.seed(123); replicate(3, trialC())
set.seed(123); replicate(3, trialSugar())
输出
通过Rscript
确保新的会话等 pp:
edd@rob:/tmp$ Rscript so50543659.R
[1] -0.560476 -0.230177 1.558708
[1] -0.560476 -0.230177 1.558708
[1] -0.560476 -0.230177 1.558708
edd@rob:/tmp$
推荐阅读
- xero-api - XERO api - 按联系人 ID 过滤预付款
- excel - 工作表函数与代码的 Excel VBA 性能,用于数组
- node.js - 如果我在 Node JS 中删除模型类 (.js) 会发生什么
- bluetooth-lowenergy - 一个BLE特性中多个字段的字节顺序
- vagrant - Vagrant 不与 NFS 同步
- android - 折叠工具栏布局不显示工具栏
- angular - 如何在angular 6中开发masterpage,详细信息页面结构?
- spring-boot - AuthorizationServerEndpointsConfiguration 需要一个找不到的“java.util.List”类型的 bean
- python - LSTM 准确率太低
- javascript - 逐渐清除画布上下文(鼠标轨迹?)