伪随机数发生器(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不适用于数字确实不可预测的应用,例如 数据加密和赌博。
基于dsp的伪随机数发生器 srand()
#include<stdio.h> #include<stdlib.h> #include<time.h> int main() { srand ( time (NULL)); int i; for (i = 0; i<5; i++) printf ( "%d " , rand ()%10); } |
产出1:
3 7 0 9 8
产出2:
7 6 8 1 4
说明: srand()设置种子,rand()使用该种子生成随机数。 时间(空) 返回的秒数 1971年1月1日 i、 每次我们运行程序,我们都会有几秒钟的时间差,这会给程序带来新的种子。
广泛使用的PRNG算法 : 滞后斐波那契发生器 , 线性反馈移位寄存器 , 布卢姆·布卢姆·舒布 .
本文由 亚什·辛拉 .如果你喜欢GeekSforgek,并想贡献自己的力量,你也可以使用 贡献极客。组织 或者把你的文章寄到contribute@geeksforgeeks.org.看到你的文章出现在Geeksforgeks主页上,并帮助其他极客。
如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。