Boost logo

Boost Users :

Subject: Re: [Boost-users] Random: How to get a different seed?
From: Cedric Laczny (cedric.laczny_at_[hidden])
Date: 2011-01-24 09:43:21


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


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net