The problem
I need to produce the same (pseudo) random number sequence on different machines and compilers. If I use the same kernel, it seems that the implementetion of mersenne twister (MT) in g++ works well: regardless if I compile my program on a newer machine, with g++ 4.9 or 4.7, I get the same random numbers. But I get different ones if I use older kernel or if I change to Visual Studio's compiler. That's ok, because there's no gurantee that mersenne_twister_engine::seed
sets the internal state to the same over different compilers.
What I've already tried
I tought that applying operator<<
on the generator produces a unique result that can be used to set the generators on other machines with the operator>>
, but in case of mt19937
, it seems it is not working. To make it clear, on a computer A I had the code
mt19937 generator1A;
uniform_int_distribution<int> distribution(0, 1000);
cout << "Generating random numbers with seed 1000" << endl;
generator1A.seed(1000);
generator1A(); //to advance the state by one so operator>> will give a longer output; this is not necessary indeed
ofstream test("testseed1000.txt");
test << generator1A << endl;
for (int i = 0; i < 10; ++i)
cout << distribution(generator1A) << endl;
And it produces 252, 590, 893, ..., and a long file. I transfer the file to the other machine B, and run the following code:
mt19937 generator1B, generator2B;
uniform_int_distribution<int> distribution(0, 1000);
cout << "Generating random numbers with seed 1000, and with operator>>" << endl;
generator2B.seed(1000);
generator2B(); // to advance the state by one here as well
ifstream test("testseed1000.txt");
test >> generator1B;
cout << "************************" << endl;
cout << generator1B << endl;
cout << "************************" << endl;
cout << "With seedwith operator>>" << endl;
for (int i = 0; i < 10; ++i)
cout << distribution(generator2B) << "" << distribution(generator1B) << endl;
And it produces
654 205
205 115
115 610
The question
Can you give advices how to generate the same (pseudo) random numbers with at least VC++ on Windows and g++ on Debian and Ubuntu? I'd like to use std if it is possible and I wouldn't like to implement my own MT engine.
Notes:
- creating millions of random numbers and then reading in is not a solution
- I have to use MSVS for code developing and unix servers for simulation
- other than MT engines are also welcomed but I prefer MT
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…