-1

I am using this following piece of code and calling it in a loop so that i can get multiple random numbers for my perfect hash function. But it is giving me same number, not distinct. "min" receives 0 or 1 and max receives "p-1". Where p is a prime number greater then hash table size.

long long int generateSingleRandomNo2(long long int min, long long int max) 
{  
typedef boost::uniform_int<long long int> NumberDistribution; 
typedef boost::mt19937 RandomNumberGenerator; 
typedef boost::variate_generator<RandomNumberGenerator&,NumberDistribution> Generator; 

NumberDistribution distribution(min,max); 
RandomNumberGenerator generator; 
Generator numberGenerator(generator, distribution); 
generator.seed(time(0)); // seed with the current time 
long long int A=numberGenerator();
return A;
/*if(A>min)
  return A ;
else 
generateSingleRandomNo1(min,max);*/

}

rayan
  • 23
  • 1
  • 8

1 Answers1

1

To get distinct random numbers you need call seed(...) only once. One of possible solutions is to use static RandomNumberGenerator instance:

long long int generateSingleRandomNo2(long long int min, long long int max) 
{  
  struct RandomNumberGenerator : public boost::mt19937 {
    RandomNumberGenerator() {
      seed(time(NULL)); // seed with the current time
    }        
  };
  typedef boost::uniform_int<long long int> NumberDistribution; 
  typedef boost::variate_generator<RandomNumberGenerator&,NumberDistribution> Generator; 

  // static generator instance
  static RandomNumberGenerator generator;

  // generate random number
  NumberDistribution distribution(min, max); 
  Generator numberGenerator(generator, distribution); 
  long long int A = numberGenerator();
  return A;
  /*if(A>min)
    return A ;
    else 
    generateSingleRandomNo1(min,max);
  */
}
Rimas
  • 5,904
  • 2
  • 26
  • 38