gpt4 book ai didi

rcpp - 何时使用 RNGScope 会有所作为?

转载 作者:行者123 更新时间:2023-12-04 13:38:39 24 4
gpt4 key购买 nike

在 Rcpp 文档中,我经常发现建议放置 Rcpp::RNGScope scope;在 Rcpp 中使用随机抽奖之前。我想知道这到底是做什么的,因为我只见过它被描述为“确保 RNG 状态被设置/重置”。

然后,我进行了一些测试,但我似乎无法想出一个这样做有什么不同的例子。我使用了 here 中的示例.我的测试是:

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
NumericVector noscope() {
Rcpp::Function rt("rt");
return rt(5, 3);
}

// [[Rcpp::export]]
NumericVector withscope() {
RNGScope scope;
Rcpp::Function rt("rt");
return rt(5, 3);
}

进而
set.seed(45)
noscope() # [1] 0.6438 -0.6082 -1.9710 -0.1402 -0.6482

set.seed(45)
withscope() # [1] 0.6438 -0.6082 -1.9710 -0.1402 -0.6482

set.seed(45)
rt(5, 3) # [1] 0.6438 -0.6082 -1.9710 -0.1402 -0.6482

所以,我的问题是双重的。首先,RNGScope 什么时候发挥作用,它与不使用它究竟有什么不同?其次,有没有人有一个代码示例显示有和没有它的不同结果?

如果 RNGScope 在较新的版本中被弃用,那么我很抱歉问这个问题。

最佳答案

使用 Rcpp 属性时,自动生成的代码接口(interface)将自动插入 RNGScope 的适当结构。对象——所以在这种情况下,它已经在幕后为你完成了。例如,如果您写 sourceCpp(..., verbose = TRUE) ,你会看到这样的输出:

Generated extern "C" functions 
--------------------------------------------------------


#include <Rcpp.h>

RcppExport SEXP sourceCpp_38808_timesTwo(SEXP xSEXP) {
BEGIN_RCPP
Rcpp::RObject __result;
Rcpp::RNGScope __rngScope;
Rcpp::traits::input_parameter< NumericVector >::type x(xSEXP);
__result = Rcpp::wrap(timesTwo(x));
return __result;
END_RCPP
}

注意 RNGScope 的自动构造目的。

如果您在 Rcpp 属性范围之外进行操作,则只需手动构造该对象。

关于rcpp - 何时使用 RNGScope 会有所作为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28487583/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com