实现 Park-Miller 随机数生成算法的Java程序
Park-Miller随机数发生器也称为Lehmer 随机数发生器。这种类型的随机数生成器 (RNG) 的一般公式是,X k+1 = a * x k mod m
在模m是素数或素数的幂的情况下,乘数a是高乘法阶模m的元素,并且种子X 0与m互质。
Park-Miller 算法
1) 将变量 m、a、q、r 和 r_seed(X 0 ) 声明为常量变量并赋值
m = 2145678965L;
a = 48271L;
q = 44488L;
r = 3399L;
r_seed = 12345678L
在这里,常量 m 和 r_seed 的值是这样选择的,即GCD(m, r_seed) = 1 。模数也可以选择为素数,使得互素种子的选择变得微不足道(任何 0 < X 0 < m都可以)。这里,值a 、 q 、 r是常数。
2) 声明函数uniform,返回类型为double。
2.1) 声明变量 hi, lo, t。
2.2) 设置变量 hi, lo, t 如下:
2.2.1) hi= 作为种子除以 b
2.2.2) lo = 种子 – b * hi
2.2.3) t = a * lo – c * hi
其中hi和li分别是特定 m 和 r_seed(X 0 ) 的随机数的范围内的最高和最低数字。
2.3) 检查是否 (t > 0) 即;生成的随机数为正,然后设置r_seed = t 。
2.4) 否则设置r_seed = t + m 。 // 生成的随机数为负数
2.5)从函数uniform返回种子。
3)在main方法中
3.1) 从 i=0 开始循环到 10
3.1.1)随机调用函数并存储每次迭代的结果。
3.2)打印结果
5)结束
示例:以下程序实现了 Park-Miller 随机数生成算法。
注意:此代码的每次迭代都会产生不同的输出。
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]);
}
}
1.085252519E9 5.08259731E8 1.352291773E9 1.563240271E9 8.90733155E8