Open In App

Java Program to Implement Park-Miller Random Number Generation Algorithm

Last Updated : 15 Dec, 2020
Improve
Improve
Like Article
Like
Save
Share
Report

Park–Miller random number generator is also known as Lehmer random number generator. A general formula of a random number generator (RNG) of this type is, Xk+1 = a * xk mod m

Where the modulus m is a prime number or a power of a prime number, the multiplier a is an element of high multiplicative order modulo m, and the seed X0 is coprime to m.  

Algorithm of Park-Miller

1) Declare variables m, a, q, r and r_seed(X0) as constant variables and assign 

m = 2145678965L;
a = 48271L;
q = 44488L;
r = 3399L;
r_seed = 12345678L

Here, the value of constants m and r_seed are chosen in such a way that the GCD(m, r_seed) = 1. The modulus can also be chosen as a prime number, making the choice of a coprime seed trivial (any 0 < X0 < m will do). Here, the values a, q, r are constants.

2) Declare function uniform with double as return-type.

     2.1) Declare variable hi, lo, t.

     2.2) set variables hi, lo, t as following : 

              2.2.1) hi= as seed divided by b

              2.2.2) lo = seed – b * hi

              2.2.3) t = a * lo – c * hi

Where hi and li are the highest and lowest numbers in a range respectively for a random number for particular m and r_seed(X0).

     2.3) check if (t > 0) i.e; generated random number is positive then set  r_seed = t.

     2.4) else set r_seed = t + m. // generated random number is negative

     2.5) return seed from function uniform.

3) In the main method

     3.1) Start a loop from i=0 to 10

             3.1.1)Call the function random and store the results for each iteration.

     3.2)Print the results

5)End

Example: The below program Implements Park-Miller Random Number Generation Algorithm.

Note: Each iteration of this code will produce different output.

Java




// Java implementation of Park-Miller algorithm
  
public class Park_Miller_Random_Numbers {
  
    // m is coprime to seed r_seed
    static final long m = 2147483647L;
  
    // constants
    static final long a = 48271L;
    static final long q = 44488L;
    static final long r = 3399L;
  
    // take a r_seed that is coprime to m
    static long r_seed = 12345678L;
  
    public static double uniform()
    {
        // highest and lowest for
        // a random number generation
        // range
        long hi = r_seed / q;
        long lo = r_seed - q * hi;
  
        // calculate random number
        long t = a * lo - r * hi;
  
        // if positive
        if (t > 0)
            r_seed = t;
        else
            r_seed = t + m;
        return r_seed;
    }
  
    public static void main(String[] argv)
    {
        double[] A = new double[10];
  
        for (int i = 0; i < 5; i++)
            A[i] = uniform();
  
        for (int i = 0; i < 5; i++)
            System.out.print("  " + A[i]);
    }
}


Output

  1.085252519E9  5.08259731E8  1.352291773E9  1.563240271E9  8.90733155E8


Like Article
Suggest improvement
Previous
Next
Share your thoughts in the comments

Similar Reads