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

时间:2015-10-02 13:45:01

标签: c++ random rcpp

我正在用c ++编写一个使用c ++ rng生成随机数的类。构造函数将rng的种子作为参数。但是,当我使用rcpp包设置将类暴露给r时,种子不起作用,因为每当我实例化该类的成员时,即使我传递相同的种子,我也会得到不同的随机数。有没有一个技巧如何在使用rcpp时在c ++中设置种子?我很乐意为所有人提供帮助。

2 个答案:

答案 0 :(得分:1)

您想尝试哪种 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扩展),但可能没有像代码调用那样好主意{{1或runif()有一些(隐含的)期望参与将被调用的内容。

答案 1 :(得分:0)

感谢所有帮助。我发现了这个问题。我正在使用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生成器成为类的静态成员变量可以解决问题。我不知道为什么。