📜  伪随机数发生器(PRNG)

📅  最后修改于: 2021-04-29 11:24:58             🧑  作者: Mango

伪随机数生成器(PRNG)是一种使用数学公式生成随机数序列的算法。 PRNG生成近似于随机数属性的数字序列。

PRNG使用种子状态从任意起始状态开始。如果知道序列的起点,则可以在很短的时间内生成许多数字,也可以在以后重现。因此,这些数字是确定的和有效的

为什么我们需要PRNG?

随着计算机的出现,程序员认识到需要一种将随机性引入计算机程序的方法。但是,令人惊讶的是,由于计算机盲目遵循给定的指令,因此很难完全偶然地使计算机做某事,因此是完全可预测的。不可能从诸如计算机之类的确定性事物中生成真正的随机数,因此PRNG是一种使用计算机生成随机数的技术。

PRNG如何工作?

线性同余生成器是用于生成伪随机数的最常见和最古老的算法。生成器由递归关系定义:

Xn+1 = (aXn + c) mod m
where X is the sequence of pseudo-random values
m, 0 < m  - modulus 
a, 0 < a < m  - multiplier
c, 0 ≤ c < m  - increment
x0, 0 ≤ x0 < m  - the seed or start value

我们使用前一个随机整数,整数常量和整数模数生成下一个随机整数。首先,该算法需要一个初始种子,必须通过某种方式提供该种子。通过执行模运算来提供随机性的外观。 。

PRNG的特点

  • 高效: PRNG可以在短时间内生成许多数字,对于需要许多数字的应用程序来说非常有利
  • 确定性:如果已知序列的起点,则可以在以后的日期重现给定的数字序列。如果需要在以后的阶段再次重放相同的数字序列,则确定性非常方便。
  • 周期性的: PRNG是周期性的,这意味着该序列最终将重复其自身。虽然周期性几乎不是理想的特征,但是现代PRNG的周期很长,以至于在大多数实际情况下都可以忽略不计。

PRNG的应用

PRNG适用于需要许多随机数并且可以轻松重播相同序列的应用。这种应用程序的流行示例是模拟和建模应用程序。 PRNG不适合那些数字确实不可预测的重要应用,例如数据加密和赌博。

使用srand()的伪随机数生成器

#include
#include
#include
  
int main()
{
   srand(time(NULL));
   int i;
  
   for(i = 0; i<5; i++)
  printf("%d\t", rand()%10);
}

输出1:

3  7  0  9  8

输出2:

7  6  8  1  4

说明: srand()设置rand()用来生成随机数的种子。 time(NULL)返回编号。距1971年1月1日的秒数,即每次运行程序时,我们都有几秒钟的时间差,这为程序提供了新的种子。

广泛使用的PRNG算法:滞后斐波那契发生器,线性反馈移位寄存器,百隆Blum Shub。

随机数测验