用于实现伪随机数生成的线性同余生成器的Java程序
线性同余方法是一类伪随机数生成器 (PRNG) 算法,用于生成特定范围内的类随机数序列。该方法可以定义为:
Xi+1 = aXi + c mod m
where,
X, is the sequence of pseudo-random numbers
m, ( > 0) the modulus
a, (0, m) the multiplier
c, (0, m) the increment
X0, [0, m) – Initial value of sequence known as seed
Note: m, a, c, and X0 should be chosen appropriately to get a period almost equal to m.
- 对于 a = 1,它将是加法同余法。
- 对于 c = 0,它将是乘法同余法。
方法:
- 选择种子值 X0、模量参数 m、乘数项 a 和增量项 c。
- 初始化所需数量的随机数以生成(例如,整数变量 noOfRandomNums)。
- 定义存储以保留生成的大小为 noOfRandomNums 的随机数(此处考虑向量)。
- 用种子值初始化向量的第 0 个索引。
- 对于其余的索引,遵循线性同余法生成随机数。
randomNums[i] = ((randomNums[i – 1] * a) + c) % m
- 最后,返回随机数。
下面是上述方法的实现:
Java
// Java implementation of the above approach
import java.util.*;
class GFG {
// Function to generate random numbers
static void lcm(int seed, int mod, int multiplier,
int inc, int[] randomNums,
int noOfRandomNum)
{
// Initialize the seed state
randomNums[0] = seed;
// Traverse to generate required
// numbers of random numbers
for (int i = 1; i < noOfRandomNum; i++) {
// Follow the linear congruential method
randomNums[i]
= ((randomNums[i - 1] * multiplier) + inc)
% m;
}
}
// Driver code
public static void main(String[] args)
{
// Seed value
int seed = 5;
// Modulus parameter
int mod = 7;
// Multiplier term
int multiplier = 3;
// Increment term
int inc = 3;
// Number of Random numbers
// to be generated
int noOfRandomNum = 10;
// To store random numbers
int[] randomNums = new int[noOfRandomNum];
// Function Call
lcm(seed, mod, multiplier, inc, randomNums,
noOfRandomNum);
// Print the generated random numbers
for (int i = 0; i < noOfRandomNum; i++) {
System.out.print(randomNums[i] + " ");
}
}
}
输出
5 4 1 6 0 3 5 4 1 6
伪的字面量意思是假的或虚构的。这些随机数被称为伪数,因为使用了一些已知的算术程序来生成它们。即使生成的序列也形成一个模式,因此生成的数字似乎是随机的,但可能不是真正的随机。