I have C++ code that relies heavily on sampling (using rand()), but I want it to be reproducible. So in the beginning, I initialize srand() with a random seed and print that seed out. I want others to be able to run the same code again but initializing srand() with that same seed and get exactly the same answer as I did.
But under what circumstances is that guaranteed? I suppose that works only if the binaries are compiled with the same compiler on the same system? What are other factors that might make the answer differ from the one I got initially?
To avoid this kind of problem, write your own implementation of
rand()
! I'm no expert on random-number generation algorithms, so I'll say no more than that...The solution is to use the same code in all cases - the Boost random number library is infinitely better than any C++ standard library implementation, and you can use the same code on all platforms. Take a look at this question for example of its use and links to the library docs.
Check out implementation of rand(), and use one of the random number generators from there - which ensures repeatability no matter what platform you run on.
You're correct that the sequences might be different if compiled on different machines with different
rand
implementations. The best way to get around this is to write your own PRNG. The Linux man page forsrand
gives the following simple example (quoted from the POSIX standard):