为什么程序生成随机数很困难?

24

我的孩子问了我这个问题,可我无法给出简洁易懂的解释。

所以我希望在SO上能有人给出答案。


在SO上有许多关于随机数的问题,请看一下那些问题... - Mitch Wheat
我确实通过谷歌在stackoverflow上搜索过,但是我没有找到任何回答这个问题的问题。 - rbrayb
1
http://xkcd.com/221/ :) - Matt Hamilton
1
我仍然喜欢这个问题。 ;) - Stefan
1
非常感谢所有的回答。孩子们很开心地阅读了它们,并且获得了更好的理解。 - rbrayb
显示剩余4条评论
26个回答

2

孩子们,这是一个简单的解释:

随机性的定义是一个哲学和数学问题,超出了这个回答的范围。但根据定义,不存在所谓的“随机”数字。从形而上学的角度来看,数字只有在顺序形式下才是随机的;然而,根据样本大小,有一定的概率会出现某些统计分布。我们使用的伪随机数生成器(PRNG)只是一种产生准随机数字序列的设备,我们只能根据给定的概率估计它们是否随机。

你应该向孩子们解释,程序只能使用复杂的数学公式来模仿这些设备(根据定义,这保证了缺乏“随机性”,因为它们是某个函数或过程算法的结果)。通常,需要进行严格的统计分析,才能区分量子硬件PRNG(利用这个机会向孩子们解释海森堡原理!)和强软件PRNG的使用。


好的回答。我也认为在哲学意义上,这取决于一个人对无限的信仰。如果你断言宇宙是无限的,则所有排列组合必须存在。我认为随机只是一个尺度问题。如果我们的计算机或感知设备无法检测到重复的模式,那么从我们的角度来看它就足够“随机”。以掷骰子为例。我们认为它是随机的,但如果我们能够将其视为所有骰子掷出的无限集合,我们将看到模式。基本上是整个宇宙中所有骰子掷出的排列组合。 - Gordon Potter

1

因为不存在所谓的随机数。

随机是人类的概念,当我们无法理解数据并且不理解它时使用。如果我们相信科学最终会导致对一切运作方式的理解,那么一切肯定都是确定性的。

去掉人类因素,就没有随机,只有“这个”。它发生是因为它发生了,而不是因为它是随机的。


我喜欢这个解释。主要是因为我们经常使用“随机”来表示“现在出现一个数字,我们无法猜测或预先知道它是什么”。 - Stefan
我们知道我们不能对任何事情都有完全的了解 http://zh.wikipedia.org/wiki/不确定性原理。随机性是我们对“万物运作方式”的理解的一部分。 - tarn
“随机”不是一个布尔概念,因此你不能说某些东西要么是随机的,要么不随机。它是相对的。投掷一个公平的骰子被认为是随机的,即使你可以全知地了解影响骰子落在那个面的一切事物。 - Juliano
1
换句话说,随机数通常被认为是存在的。对于某个“随机”的值,一切都可能是随机的。请参见http://xkcd.com/221/。随机并不描述我们无法理解的数据,而是无法将当前事件与先前事件联系起来的失败。 - Juliano
1
LOL“普遍认为存在”。那就意味着是真的,对吧?随机是人类的解释。如果没有人类,就没有随机,只有“这个”。它发生是因为它发生了,而不是因为它是随机的。 - Quibblesome
显示剩余4条评论

0

0

因为程序是一个系统,而系统中的所有内容都应该具有一致性和规律性。随意性在系统中没有任何位置。


0

这很困难,因为在给定相同的输入和条件的情况下,程序每次都会产生相同的结果。根据定义,这不是随机的。


“-1,那并不完全正确;计算机不能真正地随机,但它们肯定可以表现得像是随机的。” - jcollum
兄弟,你不明白“我的孩子”这个词吗? - hasen
我想知道如何让计算机看起来“随机”。 - Alan
兄弟,"我的孩子"这个词汇哪里暗示了年龄? - Alan
反驳这个观点,当你的孩子长大后,你会用什么词来称呼他们?你的后代? - Kibbee

0
生成随机数的算法不可避免地是确定性的。它们使用一个小的随机种子来获取一长串伪随机数字。
在不引入微妙的模式到数据中的情况下,这是非常困难的。一串数字可能看起来完全随机,但可能存在重复模式,使得分布对于需要随机性的应用来说不合适。

0

计算机只能执行算法计算,而真正的随机数并不是算法性的东西。你可以得到产生行为类似于随机数的算法;这些算法被称为“伪随机数生成器”。

在过去的各个时期,人们曾经从模拟数字转换器连接到电子噪声源中制作随机数生成器,但这往往是相当专业的设备。


0

主要是因为计算机没有任何以离散、非随机方式运作的功能。计算机是可预测的,这使我们能够编写可靠的软件。如果它不可预测,那么生成随机数将更容易(因为我们的软件可以依赖于这种不可预测的方法)。

虽然可以生成伪随机数和分布随机数,但没有单独的硬件就无法生成真正的随机数。有一些硬件基于“量子”相互作用生成真正的随机数(至少根据制造商)。在线扑克网站有时会使用这些适配器来生成随机数。

显然,甚至有在线服务提供随机数 - 例如random.org


0

尽管看起来令人惊讶,但很难让计算机通过偶然性来执行某些操作。计算机盲目地遵循其指令,因此完全是可预测的(如果计算机不以这种方式遵循其指令,则说明它出现了故障)。使用计算机生成随机数有两种主要方法:伪随机数生成器(PRNG)和真随机数生成器(TRNG)。


0
实际上,在大多数现代计算机上,产生足够“随机”的数字并不困难。正如其他人所指出的那样,关键是要有一个随机源。你不能仅仅编写一个可以通过算法产生随机性的程序,但你可以观察到在大多数合理复杂度的计算机中的各种活动中的随机性,即我们通常在编写程序时考虑的那些计算机。其中一种来源是来自各种系统设备的中断时间数据。

曾经,许多计算机无法获取这些数据,只能提供伪随机性,即基于特定种子的随机但可重复分布的数字。对于许多目的来说,这已经足够了——每次选择不同的种子会产生足够好的随机性。但对于其他用途,例如加密,这并不够强大,您需要一些不可重复或可预测的随机性作为起点。今天,大多数计算机(也许除了嵌入式设备)都足够先进,可以生成加密强度的随机数的随机源。例如,Linux 有 /dev/random,.NET 框架支持具有多个实现的密码学强 RandomNumberGenerator 类。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接