(注意:这通常是关于计算中的随机[和伪随机]数及其用途。)
你永远不可能通过确定性过程获得真正的随机数,这就是为什么计算机相当不适合生成它们(因为 CPU 只能以确定性方式翻转位)。大多数语言、框架和库都使用所谓的Pseudo- 随机数生成器(PRNG)。那些需要一个seed这是一种初始状态向量,可以是单个数字或数字数组,并从那里生成一系列看似随机的值。结果通常满足某些统计测量,但不是完全随机的,因为相同的种子将产生完全相同的序列。
最简单的 PRNG 之一是所谓的线性同余发生器(LCG)。它只有一个数字作为状态(最初是种子)。然后,对于每个连续的返回值,公式如下循环:
where a, b and c are constants for the generator. c is usually a power of two, such as 232 simply because it's easy to implement (done automatically) and fast. Finding good values for a and b is hard, however. As a most trivial example, when using a = 2 and b = 0, you can see that the resulting values can never be odd. This limits the range of values the generator can yield quite severely. Generally, LCGs are a very old concept and long supplanted by much better generators, so don't use them, except in extremely limited environments (although even embedded systems can handle better generators without problem, usually) – MT19937 or its generalization, the WELL generators are usually much better for people who simply don't want to worry about the properties of their pseudo-random numbers.
PRNG 的主要应用之一是模拟。由于 PRNG 可以给出统计特性的估计或保证and由于种子的性质,他们在这里做得很好,因此可以准确地重复实验。想象一下您正在发表一篇论文并希望其他人复制您的结果。使用硬件 RNG(见下文),除了包含您使用的每个随机数之外,您别无选择。对于可以轻松使用数十亿或更多数字的蒙特卡洛模拟来说,这是......不太可行。
然后还有用于加密应用的随机数生成器,例如用于保护您的 SSL 连接。这里的例子是Windows'CryptGen随机或 Unix 的/dev/urandom。那些往往是alsoPRNG,但是他们使用所谓的“熵池”进行播种,其中包含不可预测的值。这里的要点是生成不可预测的序列,即使相同的种子仍然会产生相同的序列。为了最大限度地减少攻击者猜测序列的影响,他们需要定期重新播种。熵池是从系统中的各个点收集的:事件,例如输入、网络活动等。有时,它也会使用整个系统中假定包含垃圾的内存位置进行初始化。然而,如果这样做了,必须注意确保熵池确实包含不可预测的东西。几年前 Debian 在 OpenSSL 中犯了一些错误。
您还可以直接使用熵池来获取随机数,(即 Linux/dev/random; FreeBSD 使用相同的算法/dev/random
as for /dev/urandom
),但你不会从中得到太多,一旦空了,就需要一段时间才能补充。这就是为什么上述算法通常用于将很小的熵扩展到更大的体积。
然后是基于硬件的随机数生成器,它使用不可预测的自然过程,例如电线中的放射性衰变或电噪声。这些适用于要求最严格的应用程序,需要许多“真正的”随机数,并且通常能够每秒生成几百 MiB 的随机性(好吧,该数据点已经有几年了,但我怀疑它能做多少现在更快了)。
您可以通过编写一个程序来模拟此类事情,该程序从带镜头盖的网络摄像头(然后仅保留噪音)获取图像,或者在不存在实际输入时从音频输入获取图像。这些对于一些黑客攻击来说很好,但通常不会生成good随机数,因为它们是有偏差的,即在比特流中,零和一不以相同的频率表示(或者更进一步,序列00
, 01
, 10
and 11
不是以相同的频率生成的......您也可以对较大的序列执行此操作)。因此,实际硬件 RNG 的一部分是确保结果值满足某些统计分布属性。
有些人实际上扔骰子以获得随机骰子甚至超速行驶。而人类制造非常糟糕的随机数生成器.