【发布时间】:2014-07-31 13:33:26
【问题描述】:
我无法理解计算机如何生成随机数。 我的意思是什么硬件可以做到这一点?计算机是否只有一个来源可以做到这一点,而所有编程语言都使用它? 提前致谢。
【问题讨论】:
我无法理解计算机如何生成随机数。 我的意思是什么硬件可以做到这一点?计算机是否只有一个来源可以做到这一点,而所有编程语言都使用它? 提前致谢。
【问题讨论】:
简短的回答是,计算机无法轻易生成真正的随机数。不过,有几种方法可以生成随机数,有的快但不是随机的,有的慢但确实如此……
伪随机生成器
大多数低级语言(即 C)都内置了允许它们伪生成随机数的功能,但这并不是真正的随机数生成。它的工作原理是从一个“种子”值、一个初始数字字符串开始,然后一遍又一遍地修改这个种子,以创建一个“随机”字符串。
他们的不足之处在于,有了正确的种子和因素,可以创造条件来强制产生一定的数量。此外,由于生成的性质,绘制图表时,结果不会均匀分布。正如上述回答者所提到的,程序员可以做一些事情来使其更加随机,但由于上述原因,该方法不能真正随机。一个例子是大多数编程语言中的随机数生成器。它是硬编码的,在 CPU 中执行。
熵生成器
通过熵生成工作的随机数通过测量一种熵来工作(无序,,或者,正如我听说的那样,混沌 @duffymo 告诉我,混沌不是一个好的同义词。对不起!)这被认为是随机的。大气和热噪声是常见的测量对象。它们通常被认为比上述选择“更好”,因为它们在大多数情况下更接近真正的随机性。一个问题是它们很慢 - 除非收集到足够的熵,否则无法生成数字。一个例子是random.org,一个大气噪声熵随机数生成器(说快了 10 倍!)。它是由任何一个硬件来测量熵的。
量子发生器
熵发生器的子集,量子发生器测量量子因子(经典物理学中不使用的因子),例如the spin of particles 来确定一个数字。缺点是真正的量子发生器很昂贵。一个例子是this piece of hardware,它使用光子的路径来确定一个数字。
希望这会有所帮助!
【讨论】:
它可以是硬件,但大多数语言(如 Java 和 C#)都使用一种软件结构,Donald Knuth 在他的作品"The Art of Computer Programming":线性同余生成器中对此进行了最佳解释。
您可以想象,有problems 使用这些方法。
有人尝试改进它(例如Mersenne Twister)。
有大量的统计测试来评估称为Diehard Tests 的给定随机数生成算法。 (当我听到这些测试时,我总是想象大型车辆在暴风雪中通过鸣喇叭在寒冷中启动。)
我敢打赌,这些伪随机数生成器的周期对于您的应用来说绰绰有余。
生成真正随机数的最佳方法是使用hardware 中的自然量子过程。
【讨论】: