📜  实现 Park-Miller 随机数生成算法的Java程序

📅  最后修改于: 2022-05-13 01:55:28.969000             🧑  作者: Mango

实现 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都可以)。这里,值aqr是常数。

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

其中hili分别是特定 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