Poisson draw in Rcpp 和 R 不同的结果
Poisson draw in Rcpp and R different results
当我在 R
和 Rcpp
中使用相同的代码时,我遇到了以下矛盾
在R
我运行下面的代码
t = 0
for(i in 1:50){
t = t + rpois(1, 0.5)
}
t
[1] 28
然后我取回一个非负值t
。现在我在 Rcpp
中键入完全相同的命令
#include <Rcpp.h>
#include<Rmath.h>
using namespace Rcpp;
// [[Rcpp::export]]
int Pois(int l){
int t=0;
for(int i=0; i<50;++i){
t+=R::rpois(l);
}
return t;
}
当我调用 R
中的函数时
Pois(0.5)
[1] 0
这是错误的,因为在 R
中它不同于零
出了什么问题?
您应该使用 double l
而不是 int l
,例如
int Pois(double l){
int t=0;
for(int i=0; i<50;++i){
t+=R::rpois(l);
}
return t;
}
否则 (int) 0.5
给你 0
.
@ThomasIsCoding 已经向您展示了主要问题。但请记住,除了 R::rpois()
我们还有向量化的 Rcpp::rpois()
。而且,像往常一样,给定相同的种子,它给出与 R:
相同的平局
> set.seed(123)
> rpois(10, 0.5)
[1] 0 1 0 1 2 0 0 1 0 0
> Rcpp::cppFunction("NumericVector myrp(int n, double l) { return Rcpp::rpois(n, l); }")
> set.seed(123)
> myrp(10, 0.5)
[1] 0 1 0 1 2 0 0 1 0 0
>
当我在 R
和 Rcpp
在R
我运行下面的代码
t = 0
for(i in 1:50){
t = t + rpois(1, 0.5)
}
t
[1] 28
然后我取回一个非负值t
。现在我在 Rcpp
#include <Rcpp.h>
#include<Rmath.h>
using namespace Rcpp;
// [[Rcpp::export]]
int Pois(int l){
int t=0;
for(int i=0; i<50;++i){
t+=R::rpois(l);
}
return t;
}
当我调用 R
Pois(0.5)
[1] 0
这是错误的,因为在 R
中它不同于零
出了什么问题?
您应该使用 double l
而不是 int l
,例如
int Pois(double l){
int t=0;
for(int i=0; i<50;++i){
t+=R::rpois(l);
}
return t;
}
否则 (int) 0.5
给你 0
.
@ThomasIsCoding 已经向您展示了主要问题。但请记住,除了 R::rpois()
我们还有向量化的 Rcpp::rpois()
。而且,像往常一样,给定相同的种子,它给出与 R:
> set.seed(123)
> rpois(10, 0.5)
[1] 0 1 0 1 2 0 0 1 0 0
> Rcpp::cppFunction("NumericVector myrp(int n, double l) { return Rcpp::rpois(n, l); }")
> set.seed(123)
> myrp(10, 0.5)
[1] 0 1 0 1 2 0 0 1 0 0
>