随机数理解

时间:2014-07-31 13:33:27

标签: random language-agnostic

我无法理解计算机如何制作随机数。 我的意思是什么硬件可以做到这一点?并且计算机只有一个源来执行此操作并且所有编程语言都使用它吗? 提前致谢。

2 个答案:

答案 0 :(得分:2)

简短的回答是计算机无法轻易制作真正随机的数字。有几种方法可以生成随机数,但有些方法很快但不是随机的,有些是缓慢但真实的......

伪随机生成器

大多数低级语言(即C)具有内置功能,允许它们伪造生成随机数,但这不是真正的随机数生成。它的工作原理是从“种子”值,一个初始数字字符串开始,然后一遍又一遍地修改这个种子,以创建一个“随机”字符串。

他们的不足之处在于,通过正确的种子和因子,可以创建条件以强制生成一定数量。此外,由于生成的性质,当绘制图形时,结果将不会均匀分布。正如上面的回答者所提到的,程序员可以做些事情来使它更随机,但由于上述原因,该方法不能真正随机。一个例子是大多数编程语言中的随机数生成器。它是硬编码的,并在CPU中执行。

熵发生器

通过熵生成工作的随机数通过测量熵的类型(无序,或者,正如我所听到的那样,混乱 @duffymo告诉我,混乱不是一个好的同义词。抱歉!)被认为是随机的。大气和热噪声是常见的测量方法。它们通常被认为比上述选择“更好”,因为它们在很大程度上更接近于真正的随机性。一个问题是它们很慢 - 除非收获足够的熵,否则无法生成数字。一个例子是random.org,一个大气噪声熵随机数发生器(比如快10倍!)。它由任何硬件进行熵测量。

量子发生器

熵发生器的子集,量子发生器测量量子因子(经典物理中未使用的因子),例如the spin of particles来确定数字。缺点是真正的量子发生器很昂贵。一个例子是this piece of hardware,它使用光子的路径来确定数字。

希望这有帮助!

答案 1 :(得分:1)

它可以是硬件,但大多数语言如Java和C#使用Donald Knuth在其作品"The Art of Computer Programming"中最好地解释的软件构造:线性同余生成器。

你可以想象,problems有这些方法。

有尝试改进它(例如Mersenne Twister)。

有大量的统计测试来评估给定的随机数生成算法Diehard Tests。 (当我听到这些测试时,我总是通过按下电池来拍摄暴风雪中的大型车辆。)

我愿意打赌这些伪随机数生成器的周期对你的应用来说已经足够了。

生成真正随机数的最佳方法是在hardware中使用自然界的量子过程。