我正在用c ++编写一个使用c ++ rng生成随机数的类。构造函数将rng的种子作为参数。但是,当我使用rcpp包设置将类暴露给r时,种子不起作用,因为每当我实例化该类的成员时,即使我传递相同的种子,我也会得到不同的随机数。有没有一个技巧如何在使用rcpp时在c ++中设置种子?我很乐意为所有人提供帮助。
答案 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生成器成为类的静态成员变量可以解决问题。我不知道为什么。