Jav 实现线性同余生成器进行伪随机数生成
线性同余生成器(LCG)是一种生成类似于随机数的数字序列的技术,但实际上是确定的。这是称其为伪随机数的原因之一。
线性同余生成器(LCG)技术根据前一个数字生成随机数,并使用线性递归来生成随机数序列。
以下是使用前一个数字生成随机数的LCG公式:
\mathrm{x_{n+1}=(mult:x_{n}+:increment:mod:modulus)}
在上述公式中,’mod’表示模数运算。
\mathrm{x_{n+1}} – 要生成的下一个伪随机数
\mathrm{x_{n}} – 上一次生成的随机数。
Mult – 乘法的常数。
Increment – 加法的常数。
Modulus – 模数操作的常数。
注意 – 我们应该以这样的方式选择常数的值,以便使用LCG算法可以生成正确的随机数。此外,我们还需要选择“初始”数字,可以说是种子值,以开始生成随机数序列。
在这里,我们举了一些示例。
示例
输入
initial = 32, modulas = 11, mult = 5, increment = 13, totalNums = 15
输出
32 8 9 3 6 10 8 9 3 6 10 8 9 3 6
解释 - 根据给定的公式总共生成了15个数字。
输入
initial = 100, modulas = 74, mult = 8, increment = 37, totalNums = 5
输出
100 23 73 29 47
说明 - 在这里,数字是在1到74的范围内生成的。而且,它们看起来像是随机数。
方法1
在这个方法中,我们将使用上面解释的公式来从先前生成的随机数生成随机数序列。
算法
步骤1 - 用常量值初始化所有变量。同时,初始化’allRandoms’数组来存储随机数。
步骤2 - 执行generateRandom()函数。
步骤3 - 在generateRandom()函数中,用初始数字初始化数组的第一个元素。
步骤4 - 然后,使用循环使总迭代次数等于’totalNums’。
步骤5 - 在循环的当前迭代中,将'((allRandoms[i – 1] * mult) + increment) % modulas’的值存储在allRandoms[i]位置。
步骤6 - 打印随机数。
代码
import java.util.*;
public class Main {
static void generateRandom(int initial, int modulas, int mult, int
increment, int[] allRandoms, int totalNums) {
// Initial state of Linear Congruential Generator
allRandoms[0] = initial;
// Genereate sequence of random numbers
for (int i = 1; i < totalNums; i++) {
// linear congruential method
allRandoms[i] = ((allRandoms[i - 1] * mult) + increment) % modulas;
}
}
public static void main(String[] args) {
// Initial value, and using that, we need to start generating a random number
int initial = 32;
// Integer for modulo operation
int modulas = 11;
// Integer for multiplier
int mult = 5;
// Integer to add
int increment = 13;
// count of random numbers to be generated
int totalNums = 15;
// array to store random numbers
int[] allRandoms = new int[totalNums];
generateRandom(initial, modulas, mult, increment, allRandoms, totalNums);
// print numbers
System.out.println("Random numbers generated are: ");
for (int p = 0; p < totalNums; p++) {
System.out.print(allRandoms[p] + " ");
}
}
}
输出
Random numbers generated are:
32 8 9 3 6 10 8 9 3 6 10 8 9 3 6
时间复杂度 - O(N),因为我们要找到N个随机数。
空间复杂度 - O(N),因为我们存储了所有的随机数。然而,如果我们不需要存储任何随机数,可以将其优化为O(1)。
我们学习了线性同余生成器(LCG)算法来生成伪随机数,这是一种生成随机数序列的旧方法之一。程序员们需要注意常数值以生成高质量的随机数。此外,模数值帮助我们绑定随机数的最大限制,我们可以将生成的数值加上限制值来限定最小限制。