views:

220

answers:

4

I'm trying to produce random integers (uniformly distributed). I found this snippet on an other forum but it works in a very weird way..

 srand(time(NULL));
    AB=rand() % 10+1;

Using this method I get values in a cycle so the value increases with every call until it goes down again. I guess this has something to do with using the time as aninitializer? Something like this comes out.

 1 3 5 6 9 1 4 5 7 8 1 2 4 6 7.

I would however like to get totally random numbers like

1 9 1 3 8 2 1 7 6 7 5...

Thanks for any help

+7  A: 

You should call srand() only once per program.

Michał Górny
Ohhh, boy do I feel stupid... Thanks man
mrbuxley
+1  A: 
  • srand() has to be done once per execution, not once for each rand() call,
  • some random number generators have a problem with using "low digit", and there is a bias if you don't drop some number, a possible work around for both issues:

    int alea(int n){ 
       assert (0 < n && n <= RAND_MAX); 
       int partSize = 
         n == RAND_MAX ? 1 : 1 + (RAND_MAX-n)/(n+1); 
       int maxUsefull = partSize * n + (partSize-1); 
       int draw; 
       do { 
          draw = rand(); 
       } while (draw > maxUsefull); 
       return draw/partSize; 
    }
    
AProgrammer
+3  A: 

Also check out the Boost Random Number Library:

Boost Random Number Library

ToastedSoul
A: 

Below is the MSDN link on the Random Contructor which might help.

Random Constructor

kevchadders