证明一个随机生成的数是均匀分布的

Posted

技术标签:

【中文标题】证明一个随机生成的数是均匀分布的【英文标题】:Prove a random generated number is uniform distributed 【发布时间】:2014-08-16 01:46:07 【问题描述】:

我在一次采访中被问到这个问题。

给定一个随机数生成器来生成一个介于 [0,N) 之间的数字,如何 证明这个数是均匀分布的。

我不知道如何解决这个问题,有什么建议吗?

【问题讨论】:

如果是黑匣子,那答案肯定是统计分析;但如果源可用,您可以分析remainder bias的算法 是的,根据建议改了 这个问题是专门询问分布,还是一般的随机性? RNG 的随机性和分布是独立的,您需要为每个运行不同的测试。 @CaptainCodeman 另外,xkcd: Random Number. @ColeJohnson 不同意。显然,面试官认为这是他们希望候选人展示知识的东西。算法设计、实现和正确性通常需要数学,但这并不意味着它与数学有关。 【参考方案1】:

对于黑盒测试(您无权访问源代码),您无法证明它是均匀分布的 (UD)。但是,您可以执行统计测试来找出它是 UD 的可能性。多次运行生成器(例如,N*X 次),0 到 N 之间的每个数字应该出现 X 次左右。

这完全忽略了它是否是随机数,它只关注均匀性。但是,如果您要运行无限测试,它只会证明生成器是均匀分布的。充其量,您有可能在前 N*X 次迭代中生成器是一致的,但它很简单且易于实现。

【讨论】:

这也适用于序列0, 1, 2, ... N-1, 0, 1, 2 ...,它根本不是随机的。 @Heuster:问题不是询问 RNG 的随机性,而是询问其分布,这是一个重要的区别。 这是一个非常糟糕的指标。 这不是证据,因为你永远无法知道它在 N*X 次之后会做什么。 还有一个问题是,一些生成器,例如 .NET 使用的生成器,实际上由于熵衰减而在多次调用时变得不那么随机了。【参考方案2】:

由于这是一次面试,真正的问题不是证明均匀分布,真正的问题是被选中担任该工作。我建议您快速确定面试官是在寻找有关高等数学的有趣讨论还是在测试您的实际思维的方法。我的猜测是面试官很有可能会寻找后者。 一个好的面试答案可能是这样的:“这完全取决于随机数生成器的用途。如果它在音乐播放器上提供随机播放功能,我会让它生成 100 个数字,检查平均值是否大致等于 N/2 ,接下来简要看一下数字,然后就可以满足了。如果目的与加密有关,那就另当别论了,我会开始研究,但最终可能不会自己证明而是依靠现有的独立证明”。

【讨论】:

一种全新且非技术性的方法。算法专家的回答给我留下了深刻的印象,但我很喜欢你的回答。【参考方案3】:

这对于面试来说有点残酷(除非这是一个研究职位),但对于论坛来说却是一个有趣的问题。 20 年前,在完成我的数学学位后,我会高兴地展示一个我自己编写的随机生成器,并附上它是随机的数学证明。现在看那段代码,我很难相信是我写的。这些天来,我做任何实际程序员都会做的事情,并使用由 NAG、numpy、matlab 或其他一些备受推崇的软件包(我相信 NAG)实现的算法,也许做一些简单的统计分析来验证分布是否至关重要出于某种原因。

不过,面试中重要的是要诚实。如果你不知道,然后告诉他们你必须查一下。如果您不知道并且您不感兴趣,也可以告诉他们。做一项需要不断研究的具有挑战性的工作必须是雇主通过提供良好的工作环境来迎合的事情。挑战是好的,但对抗和竞争会适得其反('C' 太多)。

【讨论】:

【参考方案4】:

Princeton Companion to Mathematics 中对此进行了无障碍讨论

但是,如何使用确定性计算机 选择 10 30 和之间的一万个随机数 10 31 ?答案是实际上不需要这样做:几乎总是可以很好地进行伪随机选择。 ...

我们什么时候应该将这样的序列视为“随机”?同样,已经提出了许多不同的答案。一种想法是考虑简单的统计测试:我们 预计从长远来看,零的频率 应该与那些大致相同,并且更多 通常,任何小的子序列,例如 00110 应该以“正确”的频率出现(对于 这个序列 1/32 将是因为它的长度为 5)。

然而,一个序列完全有可能 通过这些简单的测试,但要由确定性程序生成。如果有人试图决定是否 一串零和一实际上是随机的—— 也就是说,通过某种方式产生,例如扔一个 硬币——那么我们将非常怀疑一个序列,如果 我们可以识别出产生相同结果的算法 顺序。例如,我们会拒绝一个序列 以简单的方式从 π 的数字推导出来,甚至 如果它通过了统计测试。然而,仅仅要求一个序列不能由递归过程产生并不能很好地测试随机性:因为 例如,如果一个人采用任何这样的顺序并交替 该序列的项为零,然后获得 一个远非随机的新序列,但仍然 不能递归产生。

出于这个原因,冯·米塞斯在 1919 年建议 零和一的序列应该被称为随机如果 不仅1的频率限制是1/2,对于任何可以“通过合理的程序”提取的子序列也是如此。 1940 年,Church 通过将“通过合理的程序”翻译为 “通过递归函数。”然而,即使这样 条件太弱:有这样的序列 不满足“迭代对数定律”(随机序列可以满足的)。现在, 1966 年提出的所谓 Martin-Löf 命题是 最常用的随机定义之一 ness:随机序列是满足所有 “有效的统计顺序检验”,我们无法在此准确表述的概念,但在 递归函数概念的基本方式。经过 与 Church 的论点相比,几乎每一个 数学家同意,Martin-Löf 命题仍在大量讨论中。

【讨论】:

【参考方案5】:

我会先问他们需要多长时间才能得到答案,以及一旦你有了生成器,他们想要的答案有多好。

是的,如果您想要彻底,运行一套全面的统计测试是不错的选择。但这可能需要几天或几周的时间。在某些情况下,可能会在与一群想要立即得到答案的人开会时提出这个问题,而最好的答案可能就是在会议中使用谷歌来查看生成器是否“足够好”,根据其他用户。 “快速谷歌”和“综合测试”之间有各种各样的答案。

在现实中你不能证明生成器在所有情况下都是 100% 一致的。案例是:

1) 你不能看源代码。因此,即使您生成 N 个看起来一致的随机数,也无法知道从 N+1 开始的每个数字都是 10(例如)而不生成更多数字。无论您停在哪里,您都不能对尚未生成的数字提出任何声明

2) 你可以看看源代码。它可能太难理解了,除非它是一个非常简单的线性同余生成器。如果它太丑陋,我会说除了欣赏代码之外,您可能无法得出任何可靠的结论。

尽管有风险,但值得一提的是,如果应用程序对随机数生成器有可预测的调用次数,那么您可以测试该生成器的调用次数。但是,我见过一些面试官会误解这一点,并假设您不知道如何制作健壮且可扩展的算法。

【讨论】:

【参考方案6】:

一个来自生成器的数字,还是您想要的任意数量?如果只有一个,你不能说任何关于统一性的事情。只要 0 ≤ number

假设面试官的意思是“大量结果的[一致性]”,您需要同时查看结果分布和结果中的模式。首先是对结果进行排序和分箱,然后查看生成的直方图。对于大量值,它应该是合理的“平坦”(例如,不是高斯曲线)。

第二个测试有点困难,因为您可能会得到 2、3 甚至 4 个或更多数字的模式。我看到的一个测试,对于三胞胎,是在球坐标中以三个为一组绘制结果(第一个是方位角,第二个是高度,第三个是半径)。我不记得细节了,但是 IIRC 你应该看到一个均匀填充的球体,或者类似的东西。这个测试可能有一个正式的术语,但底线是有许多测试可以查看 RNG 正在做什么,因此很难从最后一个输出的数字预测下一个输出(没有明显的模式) .

【讨论】:

“均匀分布”仅指分布,而不是模式(即相关性)。所以直方图就是解决问题所需要的。当然,显示结果是均匀分布的与显示结果是真正的伪随机有很大不同。【参考方案7】:

证明它,您需要知道所使用的算法,并以图形方式显示所有状态的集合构成一个循环,没有子循环,并且状态的基数空间模 N 为零,因此没有一组状态比其他状态发生得更多/更少。这就是我们如何知道 Mersenne Twister 是均匀分布的,即使 64 位版本的循环长度为 219937-1,并且在宇宙的生命周期内永远无法枚举。

否则,您可以使用统计检验来检验一致性假设。统计数据无法证明结果,它无法反驳假设。您的样本量越大,无法反驳假设就越令人信服,但这绝不是证据。 (这种观点导致与非统计学家/非科学家的沟通问题比我所知道的任何事情都多。)一致性测试有很多,包括卡方检验、Anderson-Darling 和 Kolmogorov-Smirnov 等等。

所有的一致性测试都将通过值序列,例如 0,1,2,...,N-1,0,1,... 所以一致性不足以说您拥有一个好的生成器。您还应该使用诸如间距测试、上升/下降、高于/低于平均值的运行、“生日”测试等测试来测试序列相关性。

George Marsaglia 在他的职业生涯中创建了一套非常全面的均匀性和序列相关性测试,并于 1995 年出版,他开玩笑地称之为“Diehard tests”(因为它是一组重型测试)。

【讨论】:

当您使用 Mersene Twister 均匀分布在 64b 中并且循环长度为 2^19937-1 时,您自相矛盾,因为 2^64 不能整除 2^19937-1 .因此,根据鸽子洞原理,某些数字必须比其他数字更常见。虽然偏差可能微不足道,但在技术上仍然不统一。 谢谢@MichaelAnderson,你是对的。 MT19937 % 2^64 剩下 2^64 -1。全零位的状态是不可达的,因此是-1。如果您可以枚举整个状态空间,在将所有 19937 位向量投影到 64 位空间后,您会发现有 2^(19937-64) -1 个零和 2^(19937-64) 其他所有内容,所以严格来说它不是统一的。实际上,在我们可以在有限时间内绘制的任何样本中都不会看到差异,并且差异是 22^19873 的 1 部分,实际上但在数学上不是零。【参考方案8】:

没有办法证明这一点,因为生成器可能首先生成均匀分布,然后偏离到非均匀分布。

【讨论】:

我不确定您是否可以假设“随机数生成器”具有固定行为,所以这是一个很好的观点。 嗯,仅仅通过观察结果值是不可能证明的,但是通过分析算法,它是。

以上是关于证明一个随机生成的数是均匀分布的的主要内容,如果未能解决你的问题,请参考以下文章

在Python中创建生成稀疏矩阵(均匀分布高斯分布)

在Python中创建生成稀疏矩阵(均匀分布高斯分布)

算法均匀的生成圆内的随机点

逆分布函数法生成随机数(指数分布) R语言实现

用均匀分布随机变量生成泊松分布随机变量

以均匀随机分布生成任意斜率随机线性分布