伪随机数生成器(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。
随机数测验