在 Rcpp 中使用 R::runif 时获取 NaN
Getting NaN when using R::runif in Rcpp
为了用Rcpp生成标准的均匀随机数,我一直使用
Rcpp::runif(1, 0, 1)[0]
[0]
是由于 Rcpp::runif
返回 向量 。我最近发现如果你只想要一个标量,你也可以使用 R API 而使用 R::runif()
,这样我就可以避免使用这个 [0]
。我试过了,但我总是得到 nan
。这是一个小例子,.cpp
文件:
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
double unif_R() {
const double u = R::runif(1, 0);
Rcout << "u: " << u << "\n";
return u;
}
// [[Rcpp::export]]
double unif_Rcpp() {
const double u = Rcpp::runif(1, 0, 1)[0];
Rcout << "u: " << u << "\n";
return u;
}
unif_R()
函数使用R::runif(a,b)
,returns一个标量,而unif_Rcpp()
使用Rcpp::runif(n, a, b)
,returns一个向量。但是,当我在 R 中调用这些时使用:
sourceCpp('runif_test.cpp')
set.seed(21)
unif_R()
set.seed(21)
unif_Rcpp()
set.seed(21)
runif(1)
我得到以下输出:
> set.seed(21)
> unif_R()
u: nan
[1] NaN
> set.seed(21)
> unif_Rcpp()
u: 0.786115
[1] 0.7861149
> set.seed(21)
> runif(1)
[1] 0.7861149
清楚unif_Rcpp\ works, but why does
unif_R\给我nan
的?
如@user20650 所述,我犯了一个愚蠢的错误,我需要 b >= a。所以正确的代码应该是:
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
double unif_R() {
const double u = R::runif(0, 1);
Rcout << "u: " << u << "\n";
return u;
}
// [[Rcpp::export]]
double unif_Rcpp() {
const double u = Rcpp::runif(1, 0, 1)[0];
Rcout << "u: " << u << "\n";
return u;
}
这很好。
为了用Rcpp生成标准的均匀随机数,我一直使用
Rcpp::runif(1, 0, 1)[0]
[0]
是由于 Rcpp::runif
返回 向量 。我最近发现如果你只想要一个标量,你也可以使用 R API 而使用 R::runif()
,这样我就可以避免使用这个 [0]
。我试过了,但我总是得到 nan
。这是一个小例子,.cpp
文件:
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
double unif_R() {
const double u = R::runif(1, 0);
Rcout << "u: " << u << "\n";
return u;
}
// [[Rcpp::export]]
double unif_Rcpp() {
const double u = Rcpp::runif(1, 0, 1)[0];
Rcout << "u: " << u << "\n";
return u;
}
unif_R()
函数使用R::runif(a,b)
,returns一个标量,而unif_Rcpp()
使用Rcpp::runif(n, a, b)
,returns一个向量。但是,当我在 R 中调用这些时使用:
sourceCpp('runif_test.cpp')
set.seed(21)
unif_R()
set.seed(21)
unif_Rcpp()
set.seed(21)
runif(1)
我得到以下输出:
> set.seed(21)
> unif_R()
u: nan
[1] NaN
> set.seed(21)
> unif_Rcpp()
u: 0.786115
[1] 0.7861149
> set.seed(21)
> runif(1)
[1] 0.7861149
清楚unif_Rcpp\ works, but why does
unif_R\给我nan
的?
如@user20650 所述,我犯了一个愚蠢的错误,我需要 b >= a。所以正确的代码应该是:
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
double unif_R() {
const double u = R::runif(0, 1);
Rcout << "u: " << u << "\n";
return u;
}
// [[Rcpp::export]]
double unif_Rcpp() {
const double u = Rcpp::runif(1, 0, 1)[0];
Rcout << "u: " << u << "\n";
return u;
}
这很好。