Jav 实现线性同余生成器进行伪随机数生成

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)算法来生成伪随机数,这是一种生成随机数序列的旧方法之一。程序员们需要注意常数值以生成高质量的随机数。此外,模数值帮助我们绑定随机数的最大限制,我们可以将生成的数值加上限制值来限定最小限制。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程