
Hi, On Monday, 24. January 2011 14:33:23 Zoltán Lengyel wrote:
Hello, I am trying to make a simple program that can generate random integers in range, using boost::uniform_int.
http://www.boost.org/doc/libs/1_45_0/doc/html/boost_random/tutorial.html#bo ost_random.tutorial.generating_integers_in_a_range This tutorial tells: "We use mt19937<http://www.boost.org/doc/libs/1_45_0/doc/html/boost/mt19937.html>w ith the default seed as a source of randomness. The numbers produced will be the same every time the program is run. One common method to change this is to seed with the current time (std::time(0) defined in ctime)."
I have trouble getting this common method compile and work. Here's a tiny program that works, with the same seed at every run (like what the tutorial does), I have commented out my desperate tries to make the seed change.
#include "uniform_int.hpp" #include "boost/random/variate_generator.hpp" #include "boost/random/mersenne_twister.hpp" #include <time.h>
#include <iostream> using namespace std; using namespace boost;
mt19937 gen; // time_t gen = time(0);
int roll_die() { uniform_int<> dist(1, 6); variate_generator<mt19937&, uniform_int<> > die(gen, dist); //boost::variate_generator<time_t, boost::uniform_int<> > die(gen, dist); return die(); }
int main() { for (int i = 0; i < 5; i++) cout << roll_die() << endl;
return 0; }
So, I would be glad, if someone could fix this for me, to have a different seed (depending on system time) at each start. Thanks!
I use this approach: #include <ctime> #include <time.h> #include <sys/time.h> struct timeval tv; gettimeofday(&tv, 0); long int seed; seed = (tv.tv_sec * 1000000) + tv.tv_usec; // Set the seed gen.seed( seed ); I am however not sure how exact it is (high precision timer?!) and if there isn't probably a better way to get a fresh seed at every execution. It might be that rapid subsequent executions will get the same seed and thus will produce the same results. It is no surprise that your code does not work or even compile, as you define a global random generator and at the same time you want to define a time-variable with the same variable name. So with the code above, you will not need a global time variable to set the seed. You could e.g. set it before the for- loop when calling roll_die(). Besides that, asking for "if someone could fix this for me" is generally not a good idea ;) It suggests that someone should do your work instead of you... Best, Cedric