我将流串从一个随机生成器传递到另一个,以跟踪引擎的当前状态(增强随机库)。它允许我在任何时候停止并保存当前状态,以便稍后在代码中重现一系列或继续它。
它工作正常,直到我在传递相同的字符串流时使用不同的随机生成器(如下所示)。我不能为两者使用不同的流,因为在真实示例中,一个类将以随机顺序调用不同的分布......
#ifndef RANDOM_HPP
#define RANDOM_HPP
namespace RandomG{
using namespace std;
using namespace boost::random;
int getSeed()
{
ifstream rand("/dev/urandom");
char tmp[sizeof(int)];
rand.read(tmp,sizeof(int));
rand.close();
int* number = reinterpret_cast<int*>(tmp);
return (*number);
}
void Get_Rstream(stringstream &s)
{
mt19937 randgen(getSeed());
s.clear();
s << randgen;
}
template<class distribution>
class Random
{
public:
Random(distribution nd)
{
mt19937 randgen(getSeed());
rng=new variate_generator<mt19937,distribution >(randgen, nd);
}
virtual ~Random()
{
delete rng;
}
void reset(void)
{
(*rng).distribution().reset();
}
double operator()(stringstream &s)
{
double x;
s >> (*rng).engine();
x=(*rng)();
return x;
}
variate_generator<mt19937,distribution > *rng;
};
}
#endif
所以现在如果我实例化这些类的两个实例(在它的两个统一之下,但它可以是统一和高斯或其他任何东西,并且可以以随机顺序调用)。
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <boost/random/mersenne_twister.hpp>
#include <boost/random/normal_distribution.hpp>
#include <boost/random/variate_generator.hpp>
#include "Random.hpp"
using namespace boost::random;
using namespace std;
int main()
{
int M=20;
stringstream ss;
RandomG::Get_Rstream(ss);
string ss2=ss.str();
stringstream ss3;
ss3.clear();
ss3.str(ss.str());
boost::random::uniform_01<> N;
RandomG::Random<boost::random::uniform_01<> > *unif_rand1= new RandomG::Random<boost::random::uniform_01<> >(N);
boost::random::uniform_01<> U;
RandomG::Random<boost::random::uniform_01<> > *unif_rand2=new RandomG::Random<boost::random::uniform_01<> >(U);
(*unif_rand1).reset();
(*unif_rand2).reset();
for(int i=0;i<M;i++)
{
cout << (*unif_rand1)(ss) << " ";
}
for(int i=0;i<M;i++)
{
cout << (*unif_rand2)(ss) << " ";
}
cout <<"\\\\\\\\\\\\\\\\\\\\"<<"\n";
(*unif_rand1).reset();
(*unif_rand2).reset();
for(int i=0;i<M;i++)
{
cout << (*unif_rand1)(ss3) << " ";
}
for(int i=0;i<M;i++)
{
cout << (*unif_rand2)(ss3) << " ";
}
return 0;
}
这应该给我两个相同的随机数系列,而是给我相同的随机数 forunif_rand1
但不是 for unif_rand2
。根据我的理解,将相同的状态提供给两个不同的随机数生成器应该给出相同的结果,或者有什么方法可以在两次抽签之间重置它们?
结果:
0.525384 0.038626 0.563798 0.705042 0.725001 0.311586 0.843047 0.606338 0.163695 0.437574 \\\\\\\\\\
0.525384 0.038626 0.563798 0.705042 0.725001 0.0566288 0.93966 0.417343 0.686245 0.84118
感谢您的任何回复或建议(代码应该在 linux 下可重现)。