在 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;
}

这很好。