我在Python中遇到了这个函数randint(),它给出了一个整数列表中的随机整数。我无法消化的是,我们怎样才能真正模拟随机性。我怎么能真正说出任何编程语言中的随机函数都不能给出有偏差的结果? BellCurve?
我们如何模拟随机性如此自然的东西?我们可以计算出现结果的概率。但永远无法说明这是如何运作的。
为了模拟某些内容,我们需要完全了解该主题,不是吗?
答案 0 :(得分:3)
将熵引入计算机算法中以启动由聪明的计算机算法生成的确定性数字序列,然后拟合到用户要求的分布曲线,例如。 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则返回0。它只需要确保它是可能的。
大多数计算机生成的随机数都是伪随机数。
正如你在问题中所提到的那样,计算机无法模拟真正的随机性;所有随机算法都确定性地生成随机数;意思是如果知道算法的初始种子,算法使用的熵以及算法所进行的迭代,则可以确定“随机”数。真正的随机性只能通过观察随机事件的结果来实现,这可能是计算机组件或其他现象的物理性质。
有人可能会争辩说,自然随机性实际上不是随机的,而只是一个未知的事件序列。不是不可知的(即熵),但目前还不知道。它只是未知(随机),因为我们无法解释或预测它,因为技术或知识的进步不足。有真正的混沌熵,但除非我们谈论量子计算机,否则没关系。出于大多数适用的软件应用程序的目的,只需要非常好的伪RNG。
考虑到1000年前的一段时间,我们可以说海洋容易受到随机海啸的影响。现在我们拥有更先进的技术和理解,我们可以创建预测模型。随着我们输入有关导致海啸的所有事件的更多信息,这些预测模型变得更加准确。
计算机难以模拟的部分是熵。熵是最简单的随机性。当生成素数元组时,通常用于创建一系列随机数的算法将从外部源收集熵;移动鼠标,电子噪音,从内置WiFi或蓝牙等天线收集的“噪音”。熵是创建一组好的模拟随机数的关键。
即使我们在收集熵方面取得了所有进步,仍然可以诱导机器生成一组特定的熵,然后允许攻击者准确预测正在生成的数字。如果算法从麦克风收集噪声,它们可以在正确的时间产生响亮且可预测的噪声,以便影响稍后将生成的数字序列。所有其他形式的收集熵都可以这样说。
获得真正随机性的一种简单方法是使用Random.org。
随机性来自大气噪声,出于多种目的 优于通常使用的伪随机数算法 计算机程序。
答案 1 :(得分:1)
由于你要模拟随机性,你最终将使用伪随机数生成器。该主题被广泛涵盖。 PRNG
Python的random()已经使用了Mersenne twister。而且我的猜测是你不需要比这更好的东西,除非你正在研究一些加密工具。
现在,如果你想得到一个真正的随机信号,它必须具有物理性质(例如Geiger的计数器)。但在大多数情况下,你不需要走这么远。
您的问题的答案在很大程度上取决于您的申请中随机性的目的。
答案 2 :(得分:0)
我首先要问的是随机是什么意思?这个词是先验不可预测的结果的简写。您可以尝试使用诸如entropy之类的度量来量化不可预测性的程度,但随机性本身是二元状态:事件可以确定地预测(熵= 0),或者它是随机的。不同的概率分布,例如钟形曲线(正常)或均匀具有不同的熵量,但它们都符合随机性,因为它们的熵非零 - 您无法确定地预测结果。
大多数编程语言都实现了某种类型的伪随机数发生器(PRNG)。这些是确定性算法,使用chaotic behavior来模拟随机性的不可预测性。如果您知道正在应用的算法和初始状态,您可以绝对确定地预测PRNG的结果。但是,我们可以从艾伦图灵的模仿游戏中获取灵感。"想象一下,你有两个黑盒数字源,其中一个包含一个PRNG(但你不知道它的初始状态),而另一个包含一个"真正的"随机性(无论那意味着什么)。如果您被允许应用您可以想到的任何测试,并且您无法分辨您计划在计算机程序中使用的样本范围内的哪个,那么您使用哪个测试是否重要?
你怎么知道PRNG可以使用?基本上,它归结为相信设计算法的人知道他们在做什么,并且实施能够很好地抵抗tests专门用于捕捉可识别非随机行为的PRNG的电池,例如Marsaglia& #39; s Diehard tests或更新的Dieharder套件,或NIST提供的套件。
答案 3 :(得分:0)
我们如何模拟随机性如此自然的东西?
TL; DR:
通过了解是什么让某些事情随机行动"
放射性衰变几乎完全充当泊松过程。不太完美,在世界杯比赛中得分可以被建模为泊松过程。 (但它足以让拉斯维加斯赚钱。)另一方面,抛硬币的结果就是伯努利过程的一个例子。存在许多不同类型的随机过程,并且这些不同的随机过程导致不同种类的随机分布。知道幕后发生的事情很重要。
通过聪明并做出恰当的简化假设
建模者技巧包中最有用的工具之一是中心极限定理。添加很多很多随机影响,最终结果往往看起来像高斯("贝尔曲线"在问题中提到)。假设高斯分布是一个很好的简化假设,但它可能会遇到麻烦。一个人必须足够聪明,以避免过于简单化的假设。
通过良好的先前收集的统计数据
人们确定放射性衰变确实是泊松过程需要一段时间。他们通过拥有以前采取的测量的良好历史来确定这一点。没有以前收集的统计数据,所有人都有猜测。猜测非常擅长咬住后方猜测的人。
拥有足够好的PRNG
使用确定性伪随机数发生器有很多原因。 PRNG并不是随机的"从某种意义上说,蒙特卡罗模拟的#12345运行可以完全重复,这可能是一件好事。如果模拟车辆爆炸或模拟病人在蒙特卡罗模拟中死亡,任何理智的人都会想要详细调查该案例。
幸运的是,有很多非常好的PRNG。 Python使用Mersenne twister。虽然不是最好的,但它非常非常好。
通过一种算法将PRNG的输出映射到基础统计分布*
如果没有办法将Mersenne twister(或者你正在使用的任何PRNG)的结果翻译成手头的发行版,你就会干杯。幸运的是,我们之前的人花费了大量时间来开发近似于大量随机分布的算法。
问题是用python标记的,所以我不得不写下python的随机包和numpy的随机包。后者甚至比作为标准python包免费获得的内置功能更好。它提供了大量算法,可以从Mersenne twister(例如)的整数输出转换为大量经常遇到的概率分布。 (在某些情况下,偶尔会遇到的概率分布。)