/** * 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; } }