使用cpp从r设置c++ rng种子
Set c++ rng seed from r using cpp
我正在用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生成器设置为类的静态成员变量可以解决这个问题。我只是不知道为什么。
相关文章:
- C++RNG(随机数生成)优化
- 我的RNG值确定了意外值
- C 11中的怪异RNG行为在定义并在不同的位置进行调用
- C++中 RNG 的正确副本
- 如何在本地设置和全局设置之间以C 11 RNG的初始状态进行切换
- 如何将 <random> RNG 作为非模板函数的参数传入?
- 如何在C 中设置RNG的种子
- 如何正确选择rng种子进行并行处理
- 这thread_local RNG种子有什么作用
- 不可预测的伪RNG
- c++rand()和来自boost的RNG生成相同的数字(在发布模式中),即使srand(0)也是如此
- c++ 中 rng 的实际成本与 ref 的比较
- 当我可以将RNG传递给分发时,为什么要使用variate_generator?(特别是C++和Boost)
- 为什么这些RNG在C++中没有产生类似的结果?
- 将 rng 的列表存储在 std::array 中以进行多线程处理
- 线程安全的并行RNG比顺序rand()慢
- 使用cpp从r设置c++ rng种子
- Boost rng vs OpenCV rng vs c++11 std::random?
- c++ RNG:如何在不同的处理器上获得不同的rand生成器
- OpenCV: RNG生成相同的数字