/**
* This class uses a linear congruential generator (LCG) to generate a
* sequence of pseudo-random numbers.
*
* The equation for an LCG is given by:
* ri+1 = (a*ri + c) % m
*
*
* This equation returns pseudo-random numbers in the range [0...m-1]
*
* @author alchambers
* @version sp19
*
*/
public class RandomNumberGenerator{
private int r; // internally, we must keep track of the current random number
private int m;
private int a;
private int c;
/**
* Creates a new random number generator that generates random numbers
* between [0, upper bound)
*
* @param upperBound
* The upper bound of the random numbers (exclusive)
* @param seed
* An integer to seed the random process
*/
public RandomNumberGenerator(int upperBound, int seed){
m = upperBound;
r = seed;
// c should be relatively prime to m...
// this is a very weak way of generating a relatively prime number
if(m % 3 == 0){
c = 5;
}
else{
c = 3;
}
// The rules for choosing a good value for "a" are
// 1. a-1 should be divisible by all prime factors of m
// 2. If m is divisble by 4, a-1 should be divisible by 4
if(m % 4 == 0){
a = 5;
}
else{
a = 1;
}
}
/**
* Returns a pseudo-random integer
* @return A pseudo-random integer
*/
public int nextInt(){
r = (a*r + c) % m;
return r;
}
/**
* Resets the generator
* @param newSeed A new seed for the generator
*/
public void reset(int newSeed){
r = newSeed;
}
}