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

24

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

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


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

73

那么,为什么电脑不能生成随机数呢?因为电脑只能遵循指令,而随机数则相反,不会遵循指令。如果你通过遵循指令来生成随机数,那么它就不是真正的随机数了!试想一下,要让别人按照指令选择一个随机数,这是有多困难啊。


1
我的指令 - 拿起骰子,掷一下 - 哇,一个随机数! - anon
@Neil Butterworth - 好吧,我想一台计算机也可以做到这一点! - Jesse Rusak
嗯,不确定海森堡、混沌或量子混沌会落在那个描述之下! - Mitch Wheat
@jder 我听说过有一台计算机使用放射性元素来产生随机数,另一台则使用摄像头观察熔岩灯。 - Thomas L Holaday
5
有趣的是,这些评论中提出的解决方案并不是“生成随机数的程序”,而是一个读取由其他方式生成的随机数的程序。 - John Fisher
显示剩余3条评论

15

这里有一个适合孩子的解释:

  1. 准备一个骰子(面数不重要)

  2. 在一张纸上写下以下内容:

    • 向右移动
    • 向上移动
    • 向上移动
    • 翻转骰子
    • 向下移动
    • 向右移动
  3. 向他们展示骰子和纸张。解释骰子代表计算机,纸张代表告诉计算机返回什么数字的数学或算法。

  4. 现在掷骰子。告诉他们你正在“种子”或询问计算机从一个随机的骰子位置开始。

  5. 按照纸上的每个步骤(向右移动),移动骰子。

    • 假设你掷了一个6面骰子,它种子在5。向右移动,你得到4。
  6. 解释计算机必须从一个起始值开始。这可以由许多来源给出,比如日期或鼠标移动。告诉他们,他们投掷骰子的方式决定了起始值。

  7. 解释纸片是电脑得到下一个数字的方式。告诉他们,纸上的指令可以像随机生成器的算法一样轻松更改。

  8. 玩得开心,向他们展示只受想象力限制的各种可能性。

现在回答你的问题:

告诉他们,当一个好的数学家知道起始值和计算机当前所处的步骤时,这位数学家就可以知道下一个随机数是什么。

  1. 让孩子藏纸并掷骰子。
  2. 然后要求孩子按照纸上的步骤行动,你记录他得到的下一个随机数。
  • 接下来,向他们展示你的论文。现在你已经拥有了他们的随机数生成器的副本,任何其他人都可以很容易地“猜测”下一个随机数。
  • 无论孩子用什么算法,你应该仍然能够推断出他们的算法。告诉你的孩子,在计算机世界中,没有什么是隐藏的,甚至只是观察到的数字,随机数算法也可以被发现。

    ……作为副作用,如果孩子能够想出一个让你难以推断出下一个序列的好算法,那么你就有一个聪明的孩子。 :D


    这是一个很好的解释,适合一个对数学游戏有一定兴趣的11岁孩子。 - staticsan
    如果我要设计这样的算法,它将是自修改的,该算法将根据骰子上出现的数字进行修改。这会让大多数人感到困惑,以至于他们无法轻松地跟随指示。虽然这是一个很棒的孩子友好型解释,但我能得到糖果吗? - Lie Ryan

    11

    以下是我关于随机性的解释,适合大约八年级的学生。希望您的孩子们会发现它有用!

    尽管看起来令人惊讶,计算机并不聪明。 计算机必须盲目地遵循它们的指令,因此是完全可预测的。事实上,不遵循这种方式的计算机实际上是坏掉的!我们希望计算机恰好按照我们告诉它们的那样做。

    这正是让计算机生成随机数变得困难的原因。计算机必须被告知如何生成随机数的一系列指令。但这并不是真正的随机,因为如果您把指令和相同的起始点给任何其他人,他们都可以得出相同的答案。所以只是根据指令执行,计算机不能真正生成随机数。


    我不会说计算机“不太聪明”,因为这暗示它们还有一点聪明。但事实并非如此——它们根本不聪明。正如你所说,它们严格遵循指令,没有别的。 - nobody
    那是真的。另一方面,我不想完全破坏它们所能唤起的惊奇感。此外,即使是盲目遵循指令的东西在理论上也可以是“聪明的” - 在认知/人工智能领域有许多猜测。 - John Feminella
    现在的八年级学生是否认为计算机是“聪明”的东西?我认为对他们来说,计算机只是家用电器。 - Javier
    我认为计算机实际上非常聪明。然而,由于它们如此聪明,我们设计它们只按照我们的指示执行,以免它们接管控制。 - Kibbee
    我也会说计算机“必须”是智能的,因为我们“必须”使用计算机来设计新的计算机。如果计算机从地球上消失了,我们怎么能创建一个新的计算机呢? - KFro
    据我一直听说的,计算机的智商是0。 - Jason

    10

    请让他们设计一种逐步生成随机数的方法。

    不要接受“从1到10选择一个数字”作为答案;)

    尝试解决这个问题会说明从指令集中生成随机数的困难,就像计算机实际需要做的那样。


    是的,随机性的一个关键元素是_不可预测性_。如果你知道下一个数字,它就不再是随机的了。 - John Feminella
    真正的随机性等于不可预测性吗?在研究一串随机数后,你不能使用概率来操纵随机性,以便发现8(通过随机性)已经很长时间没有出现了吗?我知道根据定义,下一个随机数会“重置历史记录”,但同时, - Stefan
    随机性会确保所有数字最终被平均选择分布。因此,概率应该是一种工具,在某些情况下使一些随机数可预测,当随机性在很长一段时间内没有出现时,这个工具可以让某个数字再次出现。 ;) - Stefan
    随机只意味着当你趋近于无限时,数字将等概率分布。 - Kibbee
    @Kibbee:拥有均匀分布不是随机数的必要属性;一些随机数生成器会生成正态分布的随机数(即高斯分布)。@KirkBroadhurst,@Stefan:对于均匀随机数,赌徒谬误适用:过去数字的统计分布对未来数字没有影响,即数字8长时间未出现并不影响它成为下一个数字的机会。 - Lie Ryan
    显示剩余5条评论

    5
    因为计算机是确定性机器。

    这是一个很好的回答,但不适合孩子们——下一个问题是“什么意思?”你会发现自己陷入了我曾经所在的境地。 - rbrayb
    正是我所想的。这是另一个问题的正确答案,但不适用于这个问题。 - Devin Jeanpierre
    3
    我希望你这个回答是开玩笑的? - hasen

    4
    在计算机上生成随机数就像在游戏标记中选择谁是“它”时玩“Eenie meenie miney moe”。表面上看起来是随机的,但当你深入细节时,它完全是确定性的。很难将“Eenie meenie miney moe”变成一个人真正无法预测结果的方案。
    此外,还存在一些使分布变得良好而均匀的困难。

    3

    因为无论输入什么,算法每次都会产生完全相同的输出。而且你不能只提供一个“随机”输入,因为你首先就是在尝试生成随机数。


    其实你可以从人类提供随机输入,一些应用程序就是这样做的:你能否随意移动鼠标并按下一些随机键?(人类是否真的能够产生真正的随机数是另一个问题) - hasen
    我认为随意移动鼠标会是随机的。除非你非常努力地尝试,否则很难创建可重复的鼠标移动。 - Kibbee

    3
    “孩子们,除非它们出了故障,电脑永远不会撒谎,而且它们总是按照你的指示去做。即使我们对结果感到失望,最终结果也总是表明它们完全忠实地执行了指令。它们只能做两件事:加一和一,以及将数字从一个位置移动到另一个位置。如果你想让它们产生随机数,你需要用加一和移动的方式来解释如何执行。一旦你解释清楚了,结果就不会是随机的。”

    然后你会得到一些困惑的眼神。 - Lie Ryan

    2

    @JaredNielsen 这个帖子是从09年发布的,当时它是原创的! - Martin Beckett

    2

    因为真正的随机源只存在于量子级别。通过适当的硬件辅助,计算机可以访问这个级别。例如,它们可以采样放射性同位素的衰变或热电阀的噪声。但你的基本PC没有这些酷炫的东西。


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