 Open in App
Not now

# Java Program to Implement Park-Miller Random Number Generation Algorithm

• Last Updated : 15 Dec, 2020

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`

My Personal Notes arrow_drop_up