为什么随机不随机?

时间:2010-11-11 16:51:13

标签: programming-languages random

有人可以解释现代编程语言(java,c#,python,javascript)如何应对随机性的限制以及这些限制(例如基于时间的种子)的起源。即如果它们是由底层操作系统和基于intel的硬件强加的。

基本上我想理解为什么没有合适的硬件就没有真正随机的数字。

5 个答案:

答案 0 :(得分:8)

设计软件是确定性的。因此,通常生成随机数的方式是使用以统计随机顺序吐出数据的公式。这样,任何需要均匀分布数字的程序都可以根据某些物理数据(即:时间戳)设置种子,并获得看似随机的数字集。但是,给定一组特定的输入,软件将始终以相同的方式执行。

要拥有真正的随机,需要输入是不确定的。

引用Wikipedia

  

生成真正随机的数字   需要精确,准确,和   可重复的系统测量   绝对不确定   流程。开源操作   系统Linux使用,例如,   各种系统时序(如用户   击键,I / O或最不重要的   数字电压测量)来产生   随机数池。它试图   不断补充游泳池,   取决于重要程度,   所以会发一个随机数。   这个系统就是一个例子,也是类似的   那些专用硬件随机   数字生成器。

答案 1 :(得分:6)

我将首先回答你问题的第二部分:

  

基本上我想理解为什么没有合适的硬件就没有真正随机的数字。

如果计算机是确定性计算机,则无法在没有特殊硬件的计算机上生成真正的随机数。这意味着,给定一些初始状态和要执行的操作,您可以预测完全机器将如何演变。例如,如果您知道,在某些假设架构中,寄存器%d0包含24并且注册%d1包含42,并且您知道指令中的下一条指令流是add %d0 %d1 %d2,然后您知道,在执行该指令后,%d2将包含66。在更高级别的语言中,您知道写x = 1; y = 2; z = x + y 导致z确定3

这是有道理的;我们不想知道添加会做什么,我们希望它添加。但是,这与生成真正的随机数不相容。对于一个真正随机的数字,无论你知道什么,都需要绝对无法来预测它。某些量子力学过程精确地具有这种行为,并且其他自然过程足够接近随机,对于所有实际目的而言,它们是(例如,如果它们看起来是随机的并且预测它们将需要知道大气中每个分子的状态) )。但是,计算机无法做到这一点,因为拥有计算机的整个是拥有一台确定性地执行代码的机器。您需要能够预测运行程序时会发生什么,否则重点是什么?

在对Milan Ramaiya's answer的评论中,您说

  

我同意你的意见,但仍然缺少最重要的事情 - 为什么计算机无法生成具有预定输入的随机数?

答案直接来自真正随机数的定义。由于真正的随机数需要完全不可预测,因此永远不会依赖于确定性输入。如果您的算法采用预先确定的输入并使用它来生成伪随机数,则只要您知道输入和算法,就可以随意复制此过程。

你也问了

  

有人可以解释现代编程语言如何应对随机性的局限性以及这些局限性的来源。

好吧,如上所述,这些限制是我们的语言和机器的确定性设计所固有的,这是有充分理由的(因此所述语言和机器可用:-))。假设您没有调用可以访问真正随机数的东西(例如存在它的系统上的/dev/random),则采用的方法是使用伪随机数生成器。这些算法旨在产生statistically random输出序列 - 在正式意义上,它看起来不可预测。我不知道足够的统计数据来解释或理解这个细节,但我相信这个想法是你可以运行某些数字测试来判断你的数据预测自己(在某种松散的意义上)以及类似的事情。然而,重要的是,虽然序列是确定性的,但它“看起来是随机的”。出于很多目的,这已经足够了!有时候它有一些优点:例如,如果你想测试代码,那么能够指定一个种子并且总是让它接收相同的伪随机数序列会很好。

总之,您的问题的总体答案是:因为我们希望能够预测计算机的功能,所以它们无法生成不可预测的数字(没有特殊硬件)。编程语言通常不会受此影响太大,因为伪随机数生成器对于大多数情况来说已经足够了。

答案 2 :(得分:1)

系统设计为可预测和离散的,没有人想要混乱的计算机,以便人们可以编程。 可预测的系统不能产生真正的随机数,只能产生可预测的数字。

答案 3 :(得分:0)

计算机通过从一长串预先生成的值中获取随机数来生成随机数。使用种子值有助于在每次运行程序时创建不同的结果,但不是修复程序,因为列表是固定的 - 它只会更改该列表中的起始位置。显然,计算机在执行操作方面非常严格,因为它们的制作方式有限,因此无法做出真正随意的事情。像random.org这样的网站会创建来自外部来源的随机数,例如无线电噪音。也许计算机应该从电源中获取噪声并将其用作真正的随机基础? :-P

答案 4 :(得分:0)

软件随机数有两个基本步骤:
  - 生成伪随机数
  - 操纵这个伪来获得更有用的数字(0到1,1到100等)

软件随机数生成器的一个常见问题是始终有循环。 这些循环由一组固定的数字组成(算法不能生成其他数字) 如果算法很好,那么循环意味着一组非常大的数字 但如果算法不好,数字设置可能不够

处理这些生成的数字只能获得1到100或0到1之间的数字(例如),以便它们对您的程序有用。 由于原始算法无法生成范围内的所有数字,因此结果集将比其他数字更频繁地获得一些数字。