【问题标题】:How do we simulate randomness?我们如何模拟随机性?
【发布时间】:2016-06-01 23:03:47
【问题描述】:

我在Python 中遇到了这个函数 randint(),它会从整数列表中为您提供一个随机整数。我无法消化的是,我们如何才能真正模拟随机性。我如何才能真正判断出任何编程语言中的随机函数都不会给出有偏差的结果?钟形曲线?

我们如何模拟随机性这样自然的事物?我们可以只计算可能出现的结果的概率。但永远无法说出这是如何工作的。

为了模拟某些东西,我们需要对主题有全面的了解,不是吗?

【问题讨论】:

  • 这更像是一道物理题。在大多数语言中使用 rand() 库时,您没有真正的随机性
  • 你不能模拟随机性,因为那样它就不再是随机的了。你可以做的是测量真正的随机事件(虽然它更复杂)。我相信在 random.org 他们使用大气噪声,而其他一些使用 CPU 中电流的某些属性。
  • 真正的随机生成器仅是硬件:idquantique.com/random-number-generation/…
  • 如果我可以问,您为什么在这里提到钟形曲线?钟形曲线适用于正态分布。随机性必须是正常的吗?
  • @Shadowfax 好吧,我只是想把我的问题说清楚..考虑到我的知识有限:D ...如果您认为可以更好地解释,请编辑问题..谢谢!

标签: python random probability random-sample probability-density


【解决方案1】:

快速回答:


        熵被引入计算机算法,以启动由聪明的计算机算法生成的确定性数字序列,然后拟合到用户要求的分布曲线,例如rand(1,10) could internally produce numbers from 0.0 to 0.9999 but needs to map to 1 through 10.。因为很难知道熵是什么,这使得确定数字变得更加困难,因此伪随机生成器的描述也变得更加困难。在统计学中,我们了解到抛硬币 100 次可能不会产生 50 次正面和 50 次反面,也不应该因为抛硬币不会那样工作。然而,这是一个很好的例子。假设沿均匀分布进行无限次迭代,概率有效。 Heads 可能会连续显示 100 次、1000 次、10,000 次。这是可能,不太可能但可能。如果 0 在可能的答案列表中,则模拟随机性的算法没有义务确保返回 0。它只需要确保它是可能的。

一般回答


大多数计算机生成的随机数都是伪随机数。

        正如您在问题中所回避的那样,计算机无法模拟真正的随机性;所有随机算法都确定性地生成随机数;这意味着如果一个人知道算法的初始种子、算法使用的熵以及算法所处的迭代,则可以确定“随机”数。真正的随机性只能通过观察随机事件的结果来实现,这可能是计算机组件的物理性质或其他现象。

        有人可能会争辩说,自然随机性实际上并不是随机的,而只是一个未知的事件序列。不是不可知的(即熵),但只是目前未知。它只是未知(随机),因为我们目前无法解释或预测它,因为技术或知识的进步不足。有真正的混沌熵,但除非我们谈论的是量子计算机,否则没关系。对于大多数适用的软件应用程序而言,只需要一个非常好的 Pseudo RNG。

        考虑到 1000 年前的一段时间,我们可以说海洋容易发生随机海啸。现在我们拥有更先进的技术和理解,我们可以创建预测模型。随着我们输入有关可能导致海啸的所有事件的更多信息,这些预测模型变得更加准确。

        计算机难以模拟的部分是熵。熵是最简单的随机性。在生成素数元组时,用于创建一系列随机数的算法通常会从外部来源收集熵;移动鼠标、电噪声、从天线(例如内置 WiFi 或蓝牙)收集的“噪声”。熵是创建一组好的模拟随机数的关键。

        即使我们在收集熵方面取得了所有进步,仍然可以诱导机器生成一组特定的熵,然后允许攻击者准确预测正在生成的数字。如果算法从麦克风收集噪声,它们可以在正确的时间产生响亮且可预测的噪声,以影响稍后将生成的数字序列。所有其他收集熵的形式也是如此。

获得真正随机性的一种简单方法是使用Random.org

随机性来自大气噪声,它有多种用途 比通常使用的伪随机数算法更好 计算机程序。

【讨论】:

  • 大多数?我所知道的是它们都是伪随机的。
  • 嗯,我认为从计算机硬件组件的随机性测得的数据也可以被认为是“计算机生成的”。
  • 我认为这不能回答 OP 的问题。
【解决方案2】:

由于您要模拟随机性,因此您最终将使用伪随机数生成器。该主题被广泛涵盖。 PRNG.

Python 的 random() 已经使用了Mersenne twister。我的猜测是,除非你正在开发一些密码学工具,否则你不会想要比这更好的了。

现在,如果您想获得真正随机的信号,它必须具有物理性质(例如盖革计数器)。但在大多数情况下,您不需要走这么远。

问题的答案很大程度上取决于应用程序中随机性的目的。

【讨论】:

    【解决方案3】:

    我首先要问随机是什么意思?这个词是先验不可预测的结果的简写。您可以尝试使用诸如entropy 之类的度量来量化不可预测性的程度,但随机性本身是一种二元状态:可以确定地预测事件(熵 = 0),或者它是随机的。不同的概率分布(例如钟形曲线(正态)或均匀分布)具有不同的熵量,但它们都属于随机分布,因为它们的熵不为零——您无法确定地预测结果。

    大多数编程语言都实现了某种类型的伪随机数生成器 (PRNG)。这些是使用chaotic behavior 来模拟随机性的不可预测性的确定性算法。如果您知道所应用的算法和初始状态,则可以绝对确定地预测 PRNG 的结果。不过,我们可以从艾伦·图灵的《模仿游戏》中获得灵感。想象一下,您有两个黑盒数字源,其中一个包含 PRNG(但您对其初始状态一无所知),而另一个包含“真实”随机性源(无论这意味着什么)。如果您被允许应用您能想到的任何测试,但您不知道哪个是您计划在计算机程序中使用的示例范围内的哪个,那么您使用哪个重要吗?

    您如何判断 PRNG 可以使用?基本上它归结为相信设计算法的人知道他们在做什么,并且该实现可以很好地抵抗tests的电池组,专门用于以可识别的非随机行为捕获PRNG,例如Marsaglia的@987654324 @ 或更新的Dieharder 套件,或可从NIST 获得的套件。

    【讨论】:

    • 在许多计算机系统中发现的加密质量 PRNG (CPRNG) 具有非确定性组件,例如来自系统外部和内部的交互,例如旋转硬盘驱动器中的空气扰动。因此,您不能绝对肯定地预测 CPRNG 的结果。
    • @zaph 这就是我讨论 PRNG 的原因。
    • 我们不限于 PRNG,使用提供的 CPRNG 更为常见,而且几乎没有理由恢复使用 PRNG。 WRT 问题 CPRNG 比 PRNG 更好地回答这个问题。
    • @zaph 不同意你的观点。我对这个问题的解读是,它是在询问我们如何证明使用确定性函数作为随机性来源的合理性。因此,我根据 PRNG 给出了答案。 CPRNG 向混合中添加了非零熵,因此相对于我认为 OP 的问题而言,这是一个旁观者。如果您不同意,请随意撰写涉及 CPRNG 的自己的答案。
    • @zaph 顺便注意一下这个问题专门问了Python的randint()的使用。这提供了根据 PRNG 而不是 CPRNG 回答的上下文——Python 使用 Mersenne Twister,它是一种 PRNG。
    【解决方案4】:

    我们如何模拟随机性这样自然的事物?

    TL;DR:

    • 通过了解是什么让某事物“随机”运行,
    • 通过聪明并做出正确的简化假设,以免问题变得太难,
    • 通过拥有良好的先前收集的统计数据以了解统计模型是否正确,
    • 拥有足够好的 PRNG,可以从中模拟随机过程,并且
    • 通过将来自该 PRNG 的输出映射到基础统计分布的算法。

    通过了解是什么让某事“随机”行事
    放射性衰变几乎完美地充当了泊松过程。不是那么完美,世界杯比赛中的进球可以建模为泊松过程。 (但拉斯维加斯已经足够赚钱了。)另一方面,抛硬币的结果是伯努利过程的一个例子。有许多不同种类的随机过程,这些不同的随机过程导致不同种类的随机分布。了解幕后发生的事情很重要。

    聪明并做出正确的简化假设
    建模者的技巧包中最有用的工具之一是中心极限定理。将很多很多很多随机影响加在一起,最终结果通常看起来是高斯的(问题中提到的“钟形曲线”)。假设高斯分布是一个很好的简化假设,但它可能会给人带来麻烦。一个人必须足够聪明,以避免过度简化假设。

    拥有良好的先前收集的统计数据
    人们花了一段时间才确定放射性衰变确实是一个泊松过程。他们通过拥有以前进行的测量的良好历史来确定这一点。如果没有以前收集的统计数据,人们所拥有的只是猜测。猜猜特别擅长在背后咬猜猜的人。

    拥有足够好的 PRNG
    使用确定性伪随机数生成器有很多原因。从蒙特卡洛模拟的运行#12345 可以精确重复的意义上说,PRNG 并不是完全“随机”的,这可能是一件好事。如果模拟车辆爆炸或模拟患者在蒙特卡洛模拟中死亡,任何理智的人都会想详细调查该案例。

    幸运的是,那里有许多非常好的 PRNG。 Python 使用 Mersenne twister。虽然不是最好的,但非常非常好。

    通过将 PRNG 的输出映射到基础统计分布的算法*
    如果没有办法将 Mersenne twister(或您使用的任何 PRNG)的结果转换为手头的发行版,那您就完蛋了。幸运的是,我们之前的人已经花费了大量时间来开发近似大量随机分布的算法。

    这个问题是用python标记的,所以我会疏忽写python的随机包和numpy的随机包。后者甚至比作为标准 python 包免费获得的内置功能更好。它提供了大量算法,可以将 Mersenne twister(例如)的整数输出转换为大量经常遇到的概率分布。 (在某些情况下,概率分布只是很少遇到。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-28
      • 2021-09-24
      • 2014-03-26
      • 2011-05-01
      相关资源
      最近更新 更多