【问题标题】:A Good and SIMPLE Measure of Randomness一个好的和简单的随机性度量
【发布时间】:2009-09-24 21:56:05
【问题描述】:

获取长整数序列(比如 100,000 个整数)并返回序列随机程度的测量值的最佳算法是什么?

该函数应该返回一个结果,如果序列不是全部随机,则返回 0,如果完全随机,则返回 1。如果序列有点随机,它可以在中间给出一些东西,例如0.95 可能是一个合理的随机序列,而 0.50 可能有一些非随机部分和一些随机部分。

如果我将 Pi 的前 100,000 位数字传递给函数,它应该给出一个非常接近 1 的数字。如果我将序列 1、2、... 100,000 传递给它,它应该返回 0。

通过这种方式,我可以轻松获取 30 个数字序列,确定每个数字的随机性,并返回有关它们相对随机性的信息。

有这样的动物吗?

…..

2019 年 9 月 24 日更新:Google may have just ushered in an era of quantum supremacy 说:

“据报道,谷歌的量子计算机能够在 3 分 20 秒内解决一个计算——证明随机数生成器产生的数字的随机性——这将花费世界上最快的传统超级计算机 Summit 大约 10,000 年。这有效地意味着传统计算机无法进行计算,谷歌率先展示了量子霸权。”

显然有一种算法可以“证明”随机性。有谁知道它是什么?这个算法还能提供随机性的度量吗?

【问题讨论】:

  • 我很惊讶地发现实际上有算法声称能够测试随机性。也许我对随机的定义与您所说的不同,但从逻辑的角度来看,这在数学上应该是不可能的。即使您传入 100K 个全为 4 的数字,它也是完全可行的,它是随机生成的。阅读一些文章,它们看起来更像是为了评估分布而不是实际随机性。
  • 发现这篇文章 (en.wikipedia.org/wiki/Statistical_randomness) 解释了统计随机性和真实随机性之间的区别,这让我明白了。有趣...
  • @lkessler - 完全由单个数字(例如 100,000 个四位)组成的真正随机序列的几率与任何其他特定数字系列的几率相同。由于您只检查一个特定的序列,因此无法知道它是否是由真正的随机过程生成的。所以你就剩下统计随机性了。
  • @JohnFx 我认为他所说的“随机性度量”的意思是,“鉴于数列的历史,预测数列中的下一个数字是多么容易”。 0 表示下一个应该是什么数字很明显(如在一串 4 中),而 1 表示它完全不明显(即没有可识别的模式)。从这个意义上说,PI(或 sqrt(2))是非常随机的(尽管如果您知道公式或如何找到数字字符串,那么它是完全确定的)。

标签: algorithm random


【解决方案1】:

您的问题会自行回答。 “如果我要将 Pi 的前 100,000 位数字传递给函数,它应该给出一个非常接近 1 的数字”,除了 Pi 的数字不是随机数,所以如果你的算法不能将非常特定的序列识别为非-random 那么它不是很好。

这里的问题是有很多类型的非随机性:- 例如。 “121,351,991,7898651,12398469018461”或“33,27,99,3000,63,231”甚至“14297141600464,14344872783104,819534228736,3490442496”绝对不是随机的。

我认为您需要做的是确定对您很重要的随机性方面- 分布、数字的分布、公因数的缺乏、素数的预期数、斐波那契数和其他“特殊”数等。

PS。随机性的快速和肮脏(非常有效)测试是否在您 gzip 后文件最终大小大致相同。

【讨论】:

  • 我很困惑你怎么能说 Pi 的数字不是随机的。确实,Pi 在其前一亿位数中的随机性对于某些应用程序(例如数据加密)可能不如其他一些随机生成器有效(请参阅:sciencedaily.com/releases/2005/04/050427094258.htm),但我从未见过任何声明过数字的东西Pi 是非随机的。
  • +1 表示“确定对您很重要的随机性方面”。如果它是随机的,那么它将通过随机性测试;但反之则不成立——没有可以验证随机性的测试,例如,一个可能在相距很远的元素之间具有非常强的相关性,并且通常必须对此进行明确的测试。事实上,我非常喜欢这个,我会写它作为我自己的答案......
  • pi 不是一个随机的数字序列,它是一个非常特殊的数字序列——它很长并且不包含任何重要的重复——但它始终是相同的序列。
  • re pi:JohnFx 指出的关于统计随机性的链接解决了关于 pi 的问题。 stackoverflow.com/questions/1474382/…
  • @lkessler:你用随机数做什么?如果按照您的建议用于加密,那么一旦密码学家意识到您正在使用来自 pi 的序列,您就会迷失方向。
【解决方案2】:

可以这样:

CAcert 研究实验室提供a Random Number Generator Analysis

Their results page 使用 7 个测试(熵、生日间距、矩阵等级、6x8 矩阵等级、最小距离、随机球体和挤压)评估每个随机序列。然后将每个测试结果用颜色标记为“无问题”、“潜在确定性”和“非随机”之一。

因此可以编写一个接受随机序列并进行 7 次测试的函数。 如果 7 个测试中的任何一个是“非随机”,则该函数返回 0。如果所有 7 个测试都是“没有问题”,则返回 1。否则,它可以根据有多少返回中间的某个数字测试以“潜在确定性”的形式出现。

此解决方案中唯一缺少的是 7 个测试的代码。

【讨论】:

  • 该结果页面是伪随机数生成器的宝库。它还显示了 pi 数字的相当高的分数(搜索 PiDigits)。当然,将 pi 的数字评估为“可能是不确定的”揭示了我们术语中的一个根本弱点。
  • 你可以从这里开始:https://www.fourmilab.ch/random/
【解决方案3】:

您可以尝试压缩序列。越成功,序列的随机性就越小。

因此,启发式随机性 = 邮政编码的长度/原始序列的长度

【讨论】:

  • 谢谢,我受到了 Kolmogorov 复杂性的启发。根据 Kolmogorov 的说法,如果一个序列不能由比该序列短的算法产生,那么它就是随机的。例如,PI 不是随机的,因为它可以通过短算法生成。
  • 嗯,zip 无法发现 PI 中的非随机性。由于 PI 不是理性的,它不会自我重复,而重复是 zip 可以发现的。但是,只需要 3.32 = log(10)/log(2) 位来表示二进制数字 (0...9)。 3.32 位是 8 位字节的 41.5%。如果你压缩了 1GB 的 PI,我猜 zip 会达到 41.5%
  • @ragnarius pi 根据定义在统计上是随机的。
  • @data 我猜你使用了十进制数字。 zip 刚刚找到了更好的表示形式。将数字视为单个长数字并改用 base-256 字节序列....您会看到 pi 中的压缩要少得多。
【解决方案4】:

正如其他人指出的那样,您无法直接计算序列的随机程度,但您可以使用多种统计测试来增加您对序列是否随机的置信度 .

DIEHARD suite 是此类测试的事实上的标准,但它既不返回单个值也不简单。

ENT - A Pseudorandom Number Sequence Test Program,是一个更简单的替代方案,它结合了 5 个不同的测试。该网站解释了每个测试的工作原理。

如果您真的只需要一个值,您可以选择 5 个 ENT 测试之一并使用它。 Chi-Squared test 可能是最好用的,但这可能不符合简单的定义。

请记住,单个测试不如在同一序列上运行多个不同的测试。根据您选择的测试,它应该足以将明显可疑的序列标记为非随机序列,但对于表面上看起来随机但实际上表现出某种模式的序列可能不会失败。

【讨论】:

  • 别忘了TestU01,酷孩子们似乎在使用它。 PractRand 看起来也很酷。
【解决方案5】:

您可以将 100.000 个输出视为随机变量的可能结果,并计算它的相关熵。它会给你一个不确定性的衡量标准。 (下图来自维基百科,您可以在Entropy 那里找到更多信息。)简单地说:

您只需要计算序列中每个数字的频率。这会给你 p(xi) (例如,如果 10 出现 27 次 p(10) = 27/L,对于你的情况,L 是 100.000。)这应该给你熵的度量。

虽然它不会给你一个介于 0 到 1 之间的数字。但 0 仍然是最小的不确定性。但是上限不会是 1。您需要标准化输出以实现这一点。

【讨论】:

  • Hmmmm.... 那么 111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999 的熵是多少?
  • 明确地说,我认为熵可能有用,但不能只是将公式应用于数据。在重复数字示例中,尽管分布具有高熵(对于数字 1-9),但相邻数字之间的差异具有非常低的熵(即不是随机的,正如我们可以清楚地看到的那样)。但是在这里,您又回到了定义随机性的含义,并直接测试该功能。 (此外,熵是一种比较棘手的测量方法,需要进行一些研究才能正确,因此最好避免使用它,除非真的需要它。)
  • 汤姆你是对的,熵本身是行不通的。实际上这是一个随机过程,您需要计算它的熵率 (en.wikipedia.org/wiki/Entropy_rate)。我不知道如何计算它。但不知何故,它需要具有高熵以及其他一些属性。您的示例 clear 具有高熵,但链中的下一个数字仍然是可预测的。
  • 我不同意。鉴于我们正在进行的测试,给出的序列是非常“随机的”。如果您改为进行自相关测试,则序列将有许多峰值,并且被认为不是很随机。不要将统计随机性与随机变量的概念混淆。统计随机性就是这样,它根据所选测试统计检查序列的随机性。
  • 图片链接已失效。请修复它。我猜你那里有某种等式?也许链接到维基百科图形?
【解决方案6】:

你所寻求的不存在,至少你现在描述的不存在。

基本问题是这样的:
如果它是随机的,那么它将通过随机性测试;但反过来不成立——没有可以验证随机性的测试。

例如,一个可能在相距很远的元素之间具有非常强的相关性,并且通常必须对此进行明确的测试。或者一个可能有一个平坦的分布,但以一种非常非随机的方式生成。等等等等。

最后,您需要确定随机性的哪些方面对您很重要,并针对这些方面进行测试(正如 James Anderson 在他的回答中所描述的那样)。我敢肯定,如果您想到任何不明显的测试方法,这里的人会提供帮助。

顺便说一句,我通常从另一方面解决这个问题:我得到了一组数据,这些数据看起来是完全随机的,但我需要确定某处是否存在模式。一般而言,非常不明显。

【讨论】:

    【解决方案7】:

    “这个序列有多随机?”是一个棘手的问题,因为从根本上讲,您对序列的生成方式感兴趣。正如其他人所说,完全有可能生成看似随机的序列,但不是来自我们认为是随机的来源(例如 pi 的数字)。

    大多数随机性测试试图回答一个略有不同的问题,即:“这个序列对于给定模型是否异常?”。如果您的模型正在掷十面骰子,那么很容易量化从该模型生成序列的可能性,并且 pi 的数字看起来不会异常。但是如果你的模型是“这个序列可以很容易地从算法中生成吗?”它变得更加困难。

    【讨论】:

    • 不,我真的要问这个:我有一系列数字。这个系列有多随机?我可能不知道或并不真正关心它是如何生成的。我只是想知道它是否是随机的。
    • 我的意思是你必须用某种模型来定义随机。
    【解决方案8】:

    我想在这里强调一下,“随机”这个词不仅意味着均匀分布,而且独立于其他一切(包括独立于任何其他选择)。

    有许多“随机性测试”可用,包括通过运行各种统计探测来估计 p 值 的测试,以及估计 min-entropy 的测试,其中大致是比特序列的最小“可压缩性”级别和“安全随机数生成器”最相关的熵度量。还有各种“randomness extractors”,例如冯诺依曼和佩雷斯提取器,可以让您了解可以从位序列中提取多少“随机性”。然而,所有这些测试和方法只能在随机性定义的第一部分(“同分布”)上比在第二部分(“独立”)上更可靠。

    一般来说,没有算法可以仅从一个数字序列判断该过程是否以独立且同分布的方式生成它们,而不知道该过程是什么。因此,例如,尽管您可以判断给定的位序列中的 0 比 1 多,但您无法判断这些位是否——

    • 真正独立于任何其他选择而生成,或
    • 构成仅“局部随机”的极长周期序列的一部分,或
    • 只是从另一个进程中重用,或者
    • 以其他方式生产,

    ...没有关于该过程的更多信息。作为一个重要的例子,一个人选择密码的过程在这个意义上很少是“随机的”,因为密码往往包含熟悉的单词或名称,以及其他原因。

    我还应该讨论在 2019 年添加到您的问题中的文章。那篇文章处理了从伪随机量子电路生成的位串分布中进行采样的任务,并且这样做的错误率很低(一项专门设计的任务量子计算机比经典计算机更容易指数级地更容易),而不是“验证”特定位序列(脱离其上下文)是否是“随机”生成的任务。在July 2020 paper 中有一个关于这个“任务”究竟是什么的解释。

    【讨论】:

      【解决方案9】:

      在计算机视觉中分析纹理时,会出现尝试测量纹理随机性的问题,以便对其进行分割。这与您的问题完全相同,因为您正在尝试确定一系列字节/整数/浮点数的随机性。我能找到的关于图像熵的最佳讨论是 http://www.physicsforums.com/showthread.php?t=274518

      基本上,它是对一系列值的随机性的统计度量。

      我也会尝试序列与自身的自相关。在自相关结果中,如果除第一个值之外没有峰值,则表示您的输入没有周期性。

      【讨论】:

        【解决方案10】:

        @JohnFx “......数学上不可能。”

        海报声明:取一长串整数...

        因此,正如《微积分》中使用极限一样,我们可以将值视为值 - 混沌研究表明,有限极限可能会“自行启动”,从而产生张量场,提供绝对的错觉,只要有时间和精力就可以运行。由于时空的曲率,没有完美 - 因此操作的“...如果完全随机,则说 1。”是用词不当。

        { 注意:已经提供了充分的观察 - 饶了我}

        根据您的立场,给定几个 k 的两个字节 [],每个独立随机 - op 无法获得“对序列随机程度的测量” Wiki 上的文章提供了丰富的信息,并取得了明确的进展问题,但是

        与经典物理学相比,量子物理学预测量子力学系统的属性取决于测量环境,即是否执行其他系统测量。

        来自因斯布鲁克的物理学家团队, 奥地利,由克里斯蒂安·鲁斯和 Rainer Blatt,第一次拥有 综合实验证明 无法解释 非语境中的量子现象 条款。

        来源:科学日报

        让我们考虑非随机的蜥蜴运动。在你最初的、更正的假设下,在豹纹壁虎的脱落尾巴中引发复杂运动的刺激源永远无法得知。我们,经验丰富的计算机科学家,承受着新手带来的天真无邪的挑战,他们非常清楚——在未受污染和原始的头脑的背景下——它们是前馈思维的宝石和发芽者。

        如果原始蜥蜴的思想场产生一个张量场(处理它的人,这是亚线性物理学的前沿研究),那么我们可以有“最好的算法来获取长序列”从鸟羽事件到通过混沌反转呈现的文明”。考虑一下蜥蜴产生的这种思想场,独立来看,是幽灵还是可知的问题。

        “直接观察哈代悖论 通过联合弱测量与 纠缠光子对”,作者 横田和弘、山本隆史、 Masato Koashi 和 Nobuyuki Imoto 来自 工程研究生院 大阪大学理科和 CREST光子量子信息 川口市项目

        来源:科学日报

        (考虑到诡异/可知的二分法)

        我从自己的实验中知道,直接观察会削弱可感知张量的绝对性,仅使用单焦点技术是不可能区分思想和可感知张量的,因为可感知张量不是原始思想。 quantaeus 的一个基本结果是,只有可感知张量的弱状态才能可靠地相互区分,而不会导致坍缩成统一的可感知张量。找个时间试一试——用纯粹的思想来表达一些想要的可能性。因为一个想法没有时间和空间,所以它是无限的。 (非有限),因此可以达到“完美”——即绝对性。只是为了提示,从天气开始,因为这是最容易影响的事情(至少据目前所知),然后尽快移动以从睡眠状态加入到清醒状态几乎没有中断顺序链接。

        当身体醒来时几乎不可避免地会有一个短暂的信号,但就像门铃响起时一样,说到这给资金可用性带来了一个有趣的统计研究领域:一个人可以同步保持多少想法?我发现二元性是实际工作的极限,在三合一时,它要么在下一个想法上中断,要么不会持续很长时间。

        也许横田等人的工作可以揭示虚假网络流量的来源......也许是鬼魂。

        【讨论】:

        • 。 . . . . . . . .什么?
        【解决方案11】:

        按照 Knuth 的说法,确保您测试低位的随机性,因为许多算法在最低位中表现出可怕的随机性。

        【讨论】:

          【解决方案12】:

          虽然这个问题很老了,但似乎并没有“解决”,所以这里是我的2分钱,表明它仍然是一个可以简单讨论的重要问题。

          考虑密码安全性。

          问题是关于“长”数字序列,“比如 100.000”,但没有说明“长”的标准是什么。对于密码,8 个字符可能被认为很长。如果这 8 个字符是“随机的”,它可能被认为是一个很好的密码,但如果它很容易被猜到,那么它就是一个无用的密码。

          常见的密码规则是混合大写、数字和特殊字符。但是常用的“Password1”仍然是一个坏密码。 (好吧,9个字符的例子,对不起)那么你应用了多少其他答案的方法,你还应该检查密码是否出现在几个字典中,包括泄露的密码集。

          但即便如此,想象一下好莱坞新星的崛起。这可能会导致一个新的著名名字,该名字将被赋予新生儿,并可能成为流行的密码,但尚未出现在字典中。

          如果我被正确告知,几乎不可能自动验证人类选择的密码是随机的,而不是通过易于猜测的算法得出的。而且,一个好的密码系统应该可以使用计算机生成的随机密码。

          结论是,没有任何方法可以验证一个 8 字符的密码是否是随机的,更不用说好的简单方法了。如果你不能验证 8 个字符,为什么验证 100.000 个数字会更容易?

          密码示例只是说明随机性问题的重要性的一个示例;还要考虑加密。随机性是安全的圣杯。

          【讨论】:

            【解决方案13】:

            测量随机性?为此,您应该充分理解其含义。问题是,如果您在互联网上搜索,您会得出结论,即存在不合格的随机性概念。对一些人来说是一回事,对另一些人来说则是另外一回事。你甚至会发现一些从哲学角度给出的定义。最常见的误导性概念之一是测试“它是随机的还是非随机的”。随机性不是“是”或“否”,它可以介于两者之间。尽管可以测量和量化“随机性”,但其概念在分类和分类方面应该保持相对。因此,以绝对的方式说某事是随机的或非随机的都是错误的,因为它是相对的,甚至是主观的。因此,说某事遵循某种模式或不遵循模式也是主观的和相对的,因为,什么是模式?为了测量随机性,你必须从理解它的数学理论前提开始。随机性背后的前提很容易理解和接受。如果您的样本空间中所有可能的结果/元素的发生概率与最大程度地实现随机性完全相同。就是这么简单。更难理解的是,将这个概念/前提与某个序列/集合或事件结果的分布联系起来,以确定某种程度的随机性。您可以将样本分成集合或子集,并且它们可能被证明是相对随机的。问题是,即使它们本身被证明是随机的,如果作为一个整体进行分析,也可以证明样本不是那么随机的。因此,为了分析随机性程度,您应该将样本视为一个整体,而不是细分。进行多次测试来证明随机性必然会导致主观性和冗余性。没有7个测试或5个测试,只有一个。并且该测试遵循已经提到的前提,因此根据结果分布类型或换句话说,给定样本的结果频率分布类型确定随机性程度。样品的具体顺序不相关。正如我已经解释的那样,只有当您决定将样本分成子集时,特定序列才会相关,而您不应该这样做。如果您考虑变量 p(样本空间中可能的结果/元素)和 n(试验/事件/实验的数量),您将有许多可能的序列 (p^n) 或 (p 的 n 次方) .如果我们认为已经提到的前提是正确的,那么这些可能的序列中的任何一个都具有完全相同的发生概率。因此,为了计算样本的“随机性”,任何特定的序列都是不确定的。重要的是计算发生样本的结果分布类型的概率。为此,我们必须计算与样本的结果分布类型相关的所有序列。因此,如果您考虑 s=(导致结果分布类型的所有可能序列的数量),那么 s/(p^n) 会给您一个介于 0 和 1 之间的值,这应该被解释为对 a 的随机性的度量具体样品。因为 1 是 100% 随机的,0 是 0% 随机的。应该说,您永远不会得到 1 或 0,因为即使样本代表最可能的随机结果分布类型,也永远无法证明它是 100%。如果一个样本代表最不可能的随机结果分布类型,它就永远不能被证明是 0%。发生这种情况是因为由于有几种可能的结果分布类型,没有一种可以代表 100% 或 0% 随机。为了确定变量 (s) 的值,您应该使用与多项分布概率相同的逻辑。该方法适用于样本空间中任意数量的可能结果/元素以及任意数量的实验/试验/事件。请注意,您的样本越大,可能的结果频率分布类型就越多,并且每个可以证明的随机性程度越小。 如果源是真正随机的,计算 [s/(n^t)]*100 将为您提供一组发生的结果频率污染类型的概率。概率越高,您的集合越随机。要实际获得随机值,您必须将 [s/(n^t)] 除以所有可能的结果频率分布类型的最大值 [s/(n^t)] 并乘以 100。

            【讨论】:

              猜你喜欢
              • 2013-11-07
              • 1970-01-01
              • 1970-01-01
              • 2013-09-02
              • 1970-01-01
              • 2011-06-09
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多