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
public class Park_Miller_Random_Numbers {
static final long m = 2147483647L;
static final long a = 48271L;
static final long q = 44488L;
static final long r = 3399L;
static long r_seed = 12345678L;
public static double uniform()
{
long hi = r_seed / q;
long lo = r_seed - q * hi;
long t = a * lo - r * hi;
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
Share your thoughts in the comments
Please Login to comment...