关于python:我们如何模拟随机性?

How do we simulate randomness?

我在python中遇到了这个函数randint(),它从整数列表中为您提供一个随机整数。我无法理解的是,我们如何才能真正模拟随机性。我怎么才能真正地告诉你,任何编程语言中的随机函数都不会产生有偏见的结果呢?BellCurve?

我们怎样才能模拟出像随机性这样自然的东西呢?我们可以计算一个结果出现的概率。但无法分辨这是如何运作的。

为了模拟我们需要对这个主题有全面的了解,不是吗?


快速回答:

& & & nbsp;nbsp;nbsp;& & & nbsp;nbsp;nbsp;& & nbsp;nbsp;引进计算机算法的熵是在揭幕在确定性序列号码是generated by which of聪明的计算机算法,然后基于the user to the distribution rand(1,10) could internally produce numbers from 0.0 to 0.9999 but needs to map to 1 through 10.for例如要曲线。因为它是很难知道that was to the熵,它使更多的数字很难测定,thus the description的伪随机发生器。我们在统计学习时报,翻转寄梅not result在50 100和50头tails恩,不应该参与flips as that不工作的方式。不管一个人多,很好的实例。the number of an无限作品assuming概率分布在iterations安任何。它是可能的头会表演100 1000 10000时代,时代,时代在中的行。这是可能的,likely but not possible。安simulates algorithm which is to randomness义务,保证下不为0,如果是在0 returned the list of possible answers)。EN only needs to保证是可能的。P></通用的答案

大多数的计算机随机数字generated是伪随机的。P></

& & & nbsp;nbsp;nbsp;& & & nbsp;nbsp;nbsp;& & nbsp;nbsp;你eluded as to你的电脑问题,不能真实的模拟randomness随机产生随机数字的算法;确定性;if the meaning of the initial seed一知道the used by the algorithm算法,熵和迭代算法,它是茶,茶是CA随机数n好矛盾。实现can only be true randomness by the of a J ^ Al随机事件的结果,which may be the Nature of计算机部件或其他物理phenomena)。P></

& & & nbsp;nbsp;nbsp;& & & nbsp;nbsp;nbsp;& & nbsp;nbsp;一randomness is not that可以argue自然现实中随机事件序列,但只是an unknown)。unknowable(即not currently unknown,but just熵)。EN is unknown(随机存储器),因为我们是unable解释或predict at this time,it,or to在科技进步的两个关联的知识。there is true混沌熵,但除非我们说关于量子计算机,它不物。for the most of applications适用用途的软件,很好的满足这RNG的是假。P></

& & & nbsp;nbsp;nbsp;& & & nbsp;nbsp;nbsp;& & nbsp;nbsp;到了1000年的时间周期,我们可以说是针感的随机tsunami'茶海。现在我们有更多的技术和先进的理解,我们可以建立预测模型。这些预测模型成为黑莓黑莓信息准确输入about as we the events which to的铅会在海啸。P></

& & & nbsp;nbsp;nbsp;& & & nbsp;nbsp;nbsp;& & nbsp;nbsp;that is the part for a计算机模拟是很难的熵。熵是它的AT,扩,randomness。当发生在早期时代numbers of the元组often used to create a?algorithm of随机数字系列将在收集从源熵;移动你的鼠标,电气噪声,噪声是从安天线such as the文集新建在WiFi或蓝牙。熵is the key to creating a good of模拟随机数字集合。P></

& & & nbsp;nbsp;nbsp;& & & nbsp;nbsp;nbsp;& & nbsp;nbsp;即使在我们已经在advancements with the集熵,机器还可以诱导产生特异性好的集of熵,which allow to accurately安则会被腐蚀predict generated the numbers。if the algorithm collects噪声从刚性住房,他们可以创建和predictable at the right大声噪音影响的时间序列以the numbers of which will be generated以后。can be the same the other forms of of说聚集的熵。P></

真正简单的方式使用randomness is to get to random.org。P></

The randomness comes from atmospheric noise, which for many purposes
is better than the pseudo-random number algorithms typically used in
computer programs.


因为你要模拟随机性,你最终会用到伪随机数生成器。这个话题被广泛地讨论。PRNG

python的random()已经使用了mersenne twister。我的猜测是你不想要比这更好的东西,除非你正在研究一些密码工具。

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

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


How can we simulate something that is so natural as randomness?

DR:

  • 通过知道什么使某物"随机"行动,
  • 聪明,正确地简化假设,以免使问题变得过于困难,
  • 通过对以前收集的数据进行良好的统计,从而知道统计模型是正确的,
  • 通过有一个足够好的prng来模拟这个随机过程,以及
  • 通过使用一种算法将该prng的输出映射到底层的统计分布。

通过知道什么使某物"随机"行动放射性衰变几乎完全起到了泊松过程的作用。不是很完美,在世界杯比赛中进球可以被看作是一个泊松过程。(但这对拉斯维加斯来说已经足够赚钱了。)另一方面,掷硬币的结果就是伯努利过程的一个例子。随机过程有很多种,这些不同的随机过程导致不同的随机分布。知道引擎盖下面发生了什么很重要。

通过聪明和正确的简化假设在建模者的技巧袋中最有用的工具之一是中心极限定理。把大量的随机影响加在一起,最终的结果通常看起来是高斯的(问题中提到的"钟形曲线")。假设高斯分布是一个很好的简化假设,但它可能会遇到麻烦。一个人必须足够聪明,以避免过于简单化的假设。

通过以前收集的良好统计数据人们花了一段时间才确定放射性衰变确实是一个泊松过程。他们通过对先前测量的良好记录来确定这一点。如果没有以前收集的统计数据,所有人都有一个猜测。猜测是非常擅长咬人谁作出的猜测在后面。

通过有一个足够好的prng使用确定性伪随机数生成器有很多原因。从蒙特卡洛模拟运行12345的意义上来说,prng不是完全"随机"的,这是一件好事。如果模拟车辆爆炸,或者模拟病人在蒙特卡洛模拟中死亡,任何理智的人都会想详细调查这个案例。

幸运的是,有许多非常好的计划。Python使用旋转木马。虽然不是最好的,但它非常非常好。

通过使用一种算法将prng的输出映射到底层的统计分布*如果无法将Mersenne Twister的结果(或您正在使用的任何prng)转换为手头的发行版,那么您将非常高兴。幸运的是,我们之前的人们花了大量时间开发了近似于大量随机分布的算法。

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


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

大多数编程语言实现某种类型的伪随机数生成器(prng)。这些是确定性算法,使用混沌行为来模拟随机性的不可预测性。如果知道正在应用的算法和初始状态,就可以绝对确定地预测PRNG的结果。然而,我们可以从阿兰图灵的"模仿游戏"中获得灵感。假设你有两个黑匣子的数字来源,其中一个包含一个prng(但你对它的初始状态一无所知),而另一个包含一个"真实"的随机性来源(无论这意味着什么)。如果你被允许进行任何你能想到的测试,而你不能分辨出你计划在你的计算机程序中使用的样本范围内是哪一个,那么你用哪一个测试有关系?

你怎么知道PRNG可以使用?基本上,它归结为信任那些设计算法的人知道他们在做什么,并且这种实现很好地支持了一系列专门用于以可识别的非随机行为捕获prng的测试,例如Marsaglia的Diehard测试或最近的Dieheard套件,或者NIST提供的测试。