gpt4 book ai didi

Rcpp 随机洗牌 : reproducing results across operating systems

转载 作者:行者123 更新时间:2023-12-03 21:53:49 25 4
gpt4 key购买 nike

我正在编写一个使用 Rcpp 包的 R 包。到目前为止,我一直在使用 R 版本 4.0.0 的 macOS Catalina 上工作和测试。使用 set.seed从 R 中,我可以从我的 Mac 获得可重复的结果。但是,在 Windows 10 机器(也使用 R 4.0.0)上进行测试时,我得到了不同的结果(使用相同的种子)。

在包裹里,我打电话std::random_shuffle生成排列。我正在使用来自 the Rcpp website 的代码去做这个。在 C++ 中,它是:

#include<Rcpp.h>

inline int randWrapper(const int n) { return floor(unif_rand()*n); }

// [[Rcpp::export]]
Rcpp::NumericVector randomShuffle(Rcpp::NumericVector a) {

// clone a into b to leave a alone
Rcpp::NumericVector b = Rcpp::clone(a);

std::random_shuffle(b.begin(), b.end(), randWrapper);

return b;
}

然后它可以来自 R 并称为

a <- 1:8
set.seed(42)
randomShuffle(a)

运行此代码我得到 8 1 4 2 7 5 3 6在我的 Mac 和 1 4 3 7 5 8 6 2 上在 Windows 上。

起初我认为这可能是由于方式的不同所致 unif_rand()是在两个操作系统上实现的,但是当我测试时

#include<Rcpp.h>

// [[Rcpp::export]]
Rcpp::NumericVector rint() {
Rcpp::NumericVector a(1);
a[0] = unif_rand();
return a;
}

我得到了与 0.914806 相同的结果在两台机器上。如果我替换 unif_rand() 也会发生同样的事情与 R::runif(0,1) .我相信 Mac 的结果是相同的 g++clang++ .

任何有关如何解决此问题的建议或见解(如果可能)将不胜感激!

最佳答案

我认为您感到困惑是因为 std::random_shuffle()实际上是一个标准的 C++ 库函数,它的 RNG 与 R 无关。所以你在 macOS 和 Windows 上得到不同的结果,我猜是由于不同的 C++ 库。

然后,您获得 runif() 的结果证实了这一思路。或 unif_rand()值。只是 std::random_shuffle() 不使用这些值.

因此,正如@BenBolker 所暗示的那样,对于跨操作系统的可重现结果,您可能希望坚持使用 R(和 Rcpp)函数。

关于Rcpp 随机洗牌 : reproducing results across operating systems,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62239848/

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