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

时间:2014-06-25 13:10:03

标签: algorithm computer-science

我在接受采访时被问到这个问题。

  

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

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

8 个答案:

答案 0 :(得分:78)

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

否则,您使用统计检验来检验均匀性假设。统计数据无法证明结果,但未能证明这一假设。样本量越大,反驳假设的失败就越大,但它永远不会证明。 (这种观点导致非统计学家/非科学家的沟通问题比我所知道的任何其他问题都多。)有许多均匀性测试,包括卡方检验,Anderson-Darling和Kolmogorov-Smirnov等等。 / p>

所有均匀性测试都会传递一系列值,例如0,1,2,...,N-1,0,1,......所以均匀性不足以说明你有一个好的发电机。您还应该测试与测试的序列相关性,例如间距测试,启动/运行,运行高于/低于平均值,"生日"测试,等等。

乔治·马萨利亚(George Marsaglia)在其职业生涯中创造了一套相当全面的统一性和序列相关性测试,并于1995年出版,他开玩笑地称之为" Diehard tests" (因为它是一个重型的测试电池)。

答案 1 :(得分:19)

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

这完全忽略了它是否是随机数,它只关注均匀性。但是,如果您要运行无限测试,它只能证明发生器是均匀分布的。最好的情况是,在第一次N * X迭代期间,您有一个发生器均匀的概率,但它很容易实现。

答案 2 :(得分:9)

没有办法证明它,因为发生器可能首先产生均匀分布,然后偏离不均匀分布。

答案 3 :(得分:7)

由于这是一次采访,真正的问题不在于证明均匀分布,真正的问题是为工作选择。我建议采用一种方法,快速决定面试官是否正在寻找有关高等数学的有趣讨论,或者正在测试你的实践思维。我的猜测是,面试官很有可能会寻找后者。 一个好的面试答案可能是这样的:"这一切都取决于需要随机数生成器。如果它在音乐播放器上提供了一个随机播放功能,我会让它生成100个数字,检查平均值是否大致等于N / 2,接下来简要查看数字并在此时可以满足。如果目的与加密有关,那将是一个不同的故事,我会开始做研究,但可能最终不会自己证明,而是依靠现有的,独立的证据"。

答案 4 :(得分:3)

只需来自发电机的一个号码,或者您想要多少?如果只有一个,你就不能说出一致性。只要0≤数量<1。 N,没关系。

假设面试官意味着&#34; [大量结果的均匀性],您需要同时查看结果分布以及结果中的模式。第一种方法是对结果进行排序和分组,并查看结果直方图。它应该是合理的&#34;平坦的&#34; (例如,不是高斯曲线)对于大量的值。

第二次测试有点困难,因为你可能会获得2,3或者甚至4或更多数字的模式。我看到的三重测试的一个测试是以球形坐标(第一个是方位角,第二个是高度,第三个是半径)以三个为一组绘制结果。我不记得细节,但IIRC你应该看到一个统一填充的球体,或类似的东西。这个测试可能是一个正式的术语,但最重要的是有很多测试可以看看RNG正在做什么,所以下一个数字很难从最后一个数字中预测出来(没有明显的)它的模式)。

答案 5 :(得分:3)

我首先询问他们想要答复的时间,以及一旦你拥有发电机他们想要的答案有多好。

是的,如果你想要彻底的话,运行一套全面的统计测试是很好的。但这可能需要数天或数周。在某些情况下,可能会在与一群想要立即回答的人的会议中询问这个问题,最好的答案可能就是在会议中使用谷歌,看看发电机是否“足够好”,根据其他用户。 “快速谷歌”和“全面测试”之间有很多答案。

奖励点提及实际上你无法证明发电机在所有情况下都是100%均匀的。案例是:

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

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

尽管存在风险,但值得一提的是,如果应用程序对随机数生成器的调用次数可预测,那么您可以测试该生成器以进行多次调用。但是,我看到一些采访者会误解这一点,并假设你不知道如何制作稳健且规模良好的算法。

答案 6 :(得分:1)

Princeton Companion to Mathematics

中可以对此进行讨论
  

但是,如何使用确定性计算机   在10 30和10之间选择一万个随机数   10 31?答案是,实际上并不需要:它几乎总是足以做出伪随机选择。 ...

     

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

     

然而,序列完全可能   通过这些简单的测试,但要通过确定性程序生成。如果有人试图决定是否   一系列零和一个实际上是随机的 -   也就是说,通过某种方式产生,例如折腾   硬币 - 然后我们会对序列非常怀疑   我们可以识别产生相同的算法   序列。例如,我们会拒绝一个序列   是从π的数字以简单的方式得出的,偶数   如果它通过了统计测试。然而,仅仅要求通过递归过程不能产生序列并不能给出随机性的良好测试:for   例如,如果一个人采取任何这样的序列和替代   用零填充该序列的术语,然后获得   一个新的序列,远非随机,但仍然是   不能递归地产生。

     

出于这个原因,冯米塞斯在1919年建议a   如果是,则应将0和1的序列称为随机   不仅是1的频率极限是1/2的情况,而且对于任何可以“通过合理的程序”提取的子序列也是如此。1940年,教会通过将“通过合理的程序”翻译成   “通过递归函数。”然而,即便如此   条件太弱:有这样的序列   不满足“迭代对数定律”(随机序列会满足的东西)。目前,   所谓的Martin-Löf论文,于1966年制定,是   随机的最常用定义之一   ness:随机序列是满足所有要素的序列   “有效的统计顺序测试”,这个概念我们不能在这里精确地制定,但是在其中使用   递归函数概念的基本方式。通过   与教会的论文形成对比,几乎每一篇都与之相提并论   数学家对此表示赞同,Martin-Löf的论文仍在讨论中。

答案 7 :(得分:1)

这对于一次采访来说是一个残酷的问题(除非这是一个研究职位),但对论坛来说这是一个有趣的问题。 20年前,在完成我的数学学位后,我会高兴地提出一个随机生成器,由我自己编写,数学证明它是随机的。现在看看那段代码,我发现很难相信我写的。这些天,我做任何实际程序员会做的事情,并使用由NAG,numpy,matlab或其他一些备受尊重的软件包(我信任NAG)实现的算法,并且可能做一些简单的统计分析来验证,如果分布是关键的由于某种原因。

接受采访时重要的是说实话。如果您不知道,那么告诉他们您必须查找它。如果您不知道并且您对它不感兴趣,那么也可以告诉它们。做一项需要不断研究的具有挑战性的工作必须是雇主通过提供良好的工作环境来满足的。挑战是好的,但对抗和竞争是适得其反的(太多'C')。