使用cpp从r设置c++ rng种子

Set c++ rng seed from r using cpp

本文关键字:c++ rng 种子 设置 cpp 使用      更新时间:2023-10-16

我正在用c++写一个类,它使用c++ rng来产生随机数。构造函数接受rng的种子作为参数。但是,当我使用rcpp包将该类公开给r时,设置种子不起作用,因为每次实例化该类的成员时,即使传递相同的种子,也会得到不同的随机数。当使用rcpp时,在c++中设置种子有什么技巧吗?很高兴能得到你的帮助。

你想播种哪个 RNG ?如果它是R的,那么你或多或少就不走运了,因为写R扩展清楚地表明你应该从R中做。

有解决办法(例如通过Rcpp::Function()),但也许你应该重新考虑这个问题。

如果你正在播种你自己的RNG,它应该工作,并为我的RcppZiggurat包工作:

R> library(RcppZiggurat)      
R> zsetseedLZLLV(12345)                 # set seed
R> zrnormLZLLV(3)
[1]  1.297770 -0.699053  0.443079
R> zsetseedLZLLV(12345)                 # re-set seed
R> zrnormLZLLV(3)
[1]  1.297770 -0.699053  0.443079       # same number
R> zrnormLZLLV(3)
[1] -0.405296 -1.771543  0.319896       # diff. now
R>

最后,如果你的问题是关于让你的RNG被R的函数使用:这是可能的(再次,参见编写R扩展),但也许不是一个好主意,因为代码调用runif()rnorm()有一些(隐含的)期望,关于什么会被调用。

谢谢大家的帮助。我找到了问题所在。我使用c++ RNG并将生成器初始化为成员函数中的静态变量,而没有将其作为类的显式成员。它在c++中工作得很好,但由于某种原因从R中调用代码时似乎不起作用。说明:

//.h file
class RandomGen{
private:
   const unsigned int seed;
public:
   RandomGen(unsigned int _seed);
   double get_num();
};
//.cpp file
RandomGen::RandomGen(unsigned int _seed):
seed(_seed)
{}
double RandomGen::get_num(){
    static std::mt19937 generator(seed);
    static std::exponential_distribution<double> distrMarket(1);
    return distrMarket(generator);
}

重现问题。将rng生成器设置为类的静态成员变量可以解决这个问题。我只是不知道为什么。