gpt4 book ai didi

r - 如何在 RcppArmadillo 中复制随机抽奖?

转载 作者:行者123 更新时间:2023-12-04 23:54:06 25 4
gpt4 key购买 nike

这是一个用于绘制 N 的 C++ 函数均值为零和标准差的独立正态偏差s

// [[Rcpp::depends(RcppArmadillo)]]

#include <RcppArmadillo.h>
using namespace Rcpp;

// [[Rcpp::export]]
List rnorm_cpp(double s, int N){

arma::colvec epsilon = s * arma::randn(N);
return List::create(Named("e") = epsilon);

}

这是一个(几乎相同的)R版本
rnormR <- function(s, N){

epsilon <- rnorm(N, mean = 0, sd = s)
return(list(e = epsilon))

}

采购后 rnorm_cpprnormR我运行了以下内容:
set.seed(1234)
fooR <- rnormR(s = 5, N = 10)

set.seed(1234)
barR <- rnormR(s = 5, N = 10)

set.seed(1234)
fooCpp <- rnorm_cpp(s = 5, N = 10)

set.seed(1234)
barCpp <- rnorm_cpp(s = 5, N = 10)

最后,我跑了 identical并得到以下结果:
> identical(fooR, barR)
[1] TRUE
> identical(barR, fooCpp)
[1] FALSE
> identical(fooCpp, barCpp)
[1] FALSE

我期待得到 TRUE对于所有这三个。我如何:(1) 在对 rnorm_cpp 的调用中复制随机抽奖和 (2) 对 rnormR 的调用获得相同的平局和 rnorm_cpp ?

最佳答案

函数arma::randn()不是 连接到 R RNG,所以调用 set.seed()拥有
对它没有影响。

我们在 Rcpp 中所做的是利用精细的 R API,它允许我们从 R 和 C++ 访问相同的 RNG。并且小心 RNGScope实例(自动插入)RNG 状态在 R 和 C++ 之间始终是正确的。

但是您根本不能假设任何其他第三方 RNG(这里:Arma's)也自动对齐。此外,在这种特殊情况下,康拉德的 Armadillo 文档很清楚:

To change the seed, use the std::srand() function



为了澄清(嗨,@DWin)这里是完整的 R 和 C++ 示例:
R> set.seed(42); rnorm(5)           ## Five N(0,1) draws in R
[1] 1.3710 -0.5647 0.3631 0.6329 0.4043
R> cppFunction('NumericVector foo(int n) { return rnorm(n); }')
R> set.seed(42); foo(5) ## Five N(0,1) draws from C++ fun.
[1] 1.3710 -0.5647 0.3631 0.6329 0.4043
R>

我们通过 R 和 C++ 获得相同的数字,因为我们 a)对 RNG 进行相同的播种,并且 b)实际上调用了 R 提供的相同 RNG。

关于r - 如何在 RcppArmadillo 中复制随机抽奖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19106032/

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