为什么不可能产生真正的随机数?


47

我试图解决一个爱好问题,该问题需要生成一百万个随机数。但是我很快意识到,使其变得独特变得越来越困难。我阅读了《算法设计手册》,以了解有关随机数生成的信息。

它有以下一段我完全无法理解。

不幸的是,生成随机数看起来比实际要容易得多。实际上,从根本上不可能在任何确定性设备上产生真正的随机数。冯·诺依曼[Neu63]最好说:“任何考虑产生随机数的算术方法的人,当然都处于犯罪状态。”我们所能期望的最好是伪随机数,它像一串数字如果它们是随机生成的。

为什么在任何确定性设备中都不可能产生真正的随机数?这句话是什么意思?


86
您是否真的在问为什么不能在确定性设备上产生真正的随机数?问题是否已经包含答案?
herby

37
如果您生成的所有数字必须唯一,则它们并不是真正随机的。真正的随机数生成器有可能连续十次给出相同的结果。
TMN

28
寻找唯一的随机数存在缺陷。如果将数字限制为唯一,则它们不是随机的,因为随机要求重复的可能性,无论多么不可能。
Mark Booth,

13
在计算机外部,是否有任何随机数是真正随机的?丢掉骰子,它是物理学中仅有很多矢量的东西。
MPelletier

9
@MPelletier:不完全是。量子力学(一旦科学家们弄清楚了更多)可能暗示着真正随机性的存在,这取决于您对随机性的定义。
布莱恩

Answers:


65

人们应该寻找一种加密安全的伪随机数发生器。大多数PRNG是线性同余生成器(next number也是的线性函数previous number),因此,如果绘制next numbervs previous number,则会得到平行线图。CSPRNG不会这样做。权衡是它们很慢。

我将随机数生成器分为3类

  1. 足以应付家庭作业。
  2. 足以打赌您的公司。
  3. 足以打赌您的国家。

为什么在任何确定性设备中都不可能产生真正的随机数?

在给定相同的起始条件和输入的情况下,确定性设备将始终产生相同的输出-这就是它的含义deterministic。“真正的随机数”更多地是一种哲学观点,因为这意味着random哲学肚脐注视的症结所在(人们甚至不确定原子衰变是随机的还是遵循我们无法弄清楚的某种模式然而)。密码安全的随机数生成器将采用某种外部熵来使设备不确定。


1
这就是为什么不可能获得真正的随机数。即使序列永远不会重复(随机数也无法保证),使用相同输入的另一次程序运行也会产生相同的结果。因此,其他人可以在以后的时间重现您的随机数,这意味着它根本不是随机的。
Spencer Rathbun

2
@ user973810信息论中有关该定义的问题是,您无法展示随机序列的实际实例。对于任何合理的定义语言,我们可以证明几乎每个无限序列(从技术意义上来说)都是随机的,因为它根本无法用该语言描述。更有用的是随机序列生成器的概念:不是生成随机序列的生成器,而是随机生成序列的生成器。
吉尔斯(Gilles)“所以,别再邪恶了”,

13
轻微鸡蛋里挑骨头:有些人,即核和粒子物理学家,是相当肯定的是,像原子衰变过程真正随机的。
David Z

9
@David:我们甚至可以走得更远。关于贝尔不等式的各种实验表明,某些量子过程绝对是不可预测的。从某种意义上讲,它们可能是随机的,也可能取决于非局部的隐藏变量,但无论哪种情况都无法进行可靠的预测。
dmckee 2011年

7
@dmckee:是的,我只是想避免在prog.SE的注释中尝试解释Bell不等式和wavefunction崩溃之间的联系会更容易。人们总是好奇地可以总是来我们的网站 ;-) Tangurena:的确,爱因斯坦确实是这么说的,但这只是意味着他真的很希望宇宙具有确定性。不是。爱因斯坦死后所做的实验表明,结论非常明确(除非存在非局部隐藏变量,也称为怪异)。仅仅因为他是爱因斯坦并不意味着他在所有事情上都是正确的。
David Z

22

真正的随机性意味着不确定性。如果是确定性的,则可以准确地预测(这就是确定性的含义);如果可以预测,则不是随机的。

从确定性伪随机数生成器中获得的最好的结果是一个数字流,该数字流具有很长的周期(除非您的RNG设备具有无限的存储空间,否则不可能重复),这在周期的长度内会产生一个流编号,它满足随机序列的所有其他属性(值的均匀分布是最有趣的值)。

为了解决这个问题,许多现代的UNIX和类Unix都有内核RNG,它们使用物理噪声源生成真正的随机性。

另一种常见方法是将当前时间用作确定性RNG的种子(srand(time(NULL));以C表示);从密码学角度来讲,这是毫无价值的,因为当前时间并不是秘密,但对于物理模拟或视频游戏而言,这已经足够了。


请注意,对于任何具有受限输出值(位数有限)的生成器,也无法进行非重复。但是,当然,确定性生成器的周期长度很可能比所有可能的排列的理论最大值都短。
9000

@ 9000:当然不是。使用数字的非理性数(任意基数)作为“随机”序列。繁荣!非重复序列(根据定义),并且仍然受限于(基于您的碱基)。
ThePopMachine 2015年

@ThePopMachine:您可以生成任意长度的非重复序列,等效于无限制长度的数字的非重复序列。您不能生成数量有限的整数(例如32位)的非重复序列;生成所有32位值的排列后,必须重复一个序列。你是对的; 我们只是在谈论不同的事情。
9000

@ 9000:没有哭泣。您发表了虚假陈述。如果您真的只是想针对n个不同的值,不超过n个k个不同的长度为k的序列,因此必须重复,那么这很明显,也没有意思。
ThePopMachine 2015年

2
@ThePopMachine:如果您调低一点,我将不胜感激。引用一下,«对于具有有限输出值(位数有限)的任何生成器,也不能重复执行”。您明确谈论的是无限制的位数,是无理数的[二进制]数字序列。您的陈述虽然正确,但与问题无关。
9000

10

Lawrence Leemis 的《离散事件模拟:第一门课程》第二章对随机数生成器(或更准确地说,伪随机数生成器)进行了精彩的介绍。

我认为他的书摘录很好地解释了这一点:

历史上一直提倡三种类型的随机数生成器用于计算应用:(a)1950年代样式的表查找生成器,例如,具有一百万个随机数字的RAND公司表;(b)硬件发生器,例如热“白噪声”设备;(c)算法(软件)生成器。在这三种类型中,只有算法生成器获得了广泛的接受。这样做的原因是,只有算法生成器才有可能满足以下所有通常公认的随机数生成标准。生成器应为:

  • 随机-能够产生通过所有合理的随机性统计检验的输出;
  • 可控制的-如果需要,可以重现其输出;
  • 便携式-能够在各种计算机系统上产生相同的输出;
  • 高效-快速,计算机资源需求最少;
  • 有据可查-理论分析和广泛测试。

因此,尽管有可能使用白噪声发生器来获得“更好的”随机数,但由于它们不遵循上述大多数标准,因此它们尚未获得认可。

我建议您先阅读该书的副本(或类似的书)。确切了解PRNG的工作方式无疑会为您的工作提供帮助。


7

因为您需要编写代码以生成随机数,而代码不是随机的。(确定性的)

因此,您首先从“ Random”(通常是当前时间戳)中选取的“ Seed value(s)”开始,然后在算法中使用它来开始生成数字。但是整个设置都是基于原始的Seed值!

因此,如果再次使用完全相同的Seed值运行代码,您将获得完全相同的数字集!有理性的人怎么能称呼那个随机的?但毫无疑问LOOK随机的。


关于使它们唯一,在生成一个数字后,只需检查您是否已有该数字,如果有,将其丢弃并生成一个新的数字。


13
从好的方面来说,可重复的伪随机数对于调试非常有用。
David Thornley

5

由于您正在生成随机数,因此应该期望生成的值是唯一的。这是随机性的属性-您不能说一个真正的随机(甚至伪随机)数序列是唯一的,因为该要求可以预测范围内的最终值,并且可以更改每次选择一个新号码时,所有未选择的号码。


1
这实际上是评论而不是答案,因为它实际上并未回答问题
马克·布思

5

我对伪随机有一个非常简单的定义:

太多未知变量无法预测。

我也有一个简单的True Random定义:

无限未知变量。

计算机的问题在于,它始终知道所有变量。随机数只是一些种子值的数学函数。
我们能做的最好的事情就是为计算机提供一个伪随机种子值,该值通常基于我们无法预测的变量(例如精确时间)。

即使计算机绝对无法创建随机数,它也擅长引入太多无法预测的变量!


1
好吧,“时间”是一个无法预料的坏例子。另一方面,鼠标移动,麦克风输入等是无法预测的输入。
HolyVieR 2011年

3

正如其他人指出的那样,用软件生成真正的随机数确实是不可能的,但是用硬件构建可以生成真正的随机数*的设备是可能的。互联网上有很多这样的示例,并且使用了多种方法,从读取盖革计数器滴答之间的时间到对未调谐接收机的白噪声(主要是来自宇宙的背景辐射)进行采样。我本人已使用一些可用的方法构建了一些

*任何一位出色的物理学家都会指出,鉴于宇宙的运行方式,这些都不是真正意义上的高技术随机性,但没有合理的方法来预测结果,因此出于讨论的考虑,它们是足够的。


5
作为兼职物理学家,基于量子事件的生成器(据我们所知)是真正随机的。自从随机性开始以来,不喜欢随机性的人们就一直试图将随机性排除在外,而它所做的只是收集更多证据,证明它是真正的随机性。
David Thornley

@DavidThornley,...直到有人弄清楚了这个公式。
CaffGeek 2011年

1
@乍得:通常意义上没有公式;EPR实验排除了这一点。可以肯定,这都是确定性的,但并非以任何易于理解的方式进行。
David Thornley

@DavidThornley,我知道这是错误的单词。我想我们知道我要说的。几乎每当有人说不可能的事情时,别人最终都会证明他们错了。这是人的本性。
CaffGeek 2011年

2
这就像说最终有人要制造可以解决暂停问题的机器,因为有人说这是不可能的。这并不是找到方程式的问题,根据所有已进行的实验和支持该方程式的数学运算,它实际上是随机的。
亚历克斯(Alex)

2

没有特殊的硬件,您无法产生随机数。在我大一的时候,我和几个同学提出了一个随机数发生器,该发生器基本上具有AM接收器,并调谐到4个不同的通道,将输入输入到A / D转换器并将它们全部相加(对最大数取模)。由于来自任意数量站点的模拟输入的组合是随机的,并且我们可以从A2D转换器生成大量随机数,因此我们建议这可能是一个很好的生成器。当然,即使从哲学上来说,这也不是真正随机的,尽管对于大多数实际目的而言,这是可行的。


2

确定性本质上是一种功能。从代数记住,函数是域和范围之间的对应关系,因此域的每个成员都恰好对应于范围的一个成员。

因此,如果f(x)= z,则除非y为z,否则f(x)!= y。那是一个功能。想象一下JavaScript:

function Add(A, B) {
      return A + B;
}

var addedNumber = Add(2,3);//returns 5
addedNumber = Add(2,3);//still 5

无论您调用Add(2,3)它多少次,都将始终返回5。换句话说,Add()是确定性函数。

外部因素可能会使Add以不确定的方式运行。例如,如果将多线程引入方程中。人为输入也会导致不确定性。

现在,事情变得有趣了。

“任何考虑产生随机数的算术方法的人当然都处于犯罪状态。”

请注意冯·诺依曼(Von Neumann)说,“生产的算术方法”。这并不是在谈论人工输入,并发,从精密仪器读取的采样风速或其他产生确定性功能的随机输入的非算法方法。

这只是说明一个功能或功能系统不会突然变得不确定。换句话说,在给定相同input的情况下,Add(2,3)不会以某种方式返回6或除5以外的任何值。那是不可能的。

引用作者将其更进一步。

我们可以期望的最好的结果是伪随机数,它看起来像是随机生成的。

上下文先前定义为“在任何确定性设备上”。我可以在这里结束辩论。但是,如果我们通过向系统中引入新元素来改变上下文呢?添加为输入的非确定性元素使系统成为非确定性系统。虽然,通过删除非确定性元素,我们可以简化为确定性系统。如果我们可以某种方式跟踪或以其他方式重现输入,则可以重现结果。但是,整个段落与作者所说的是相切的。记住上下文。

有人可能会争论不确定性的含义。再一次,tangetenial。记住上下文。

所以他是正确的。在任何确定性设备上,确定性系统不可能产生真正的随机结果。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.