如何证明一个随机数发生器比另一个好?

时间:2010-12-29 18:04:37

标签: algorithm random numbers theory

你如何证明一个RNG比另一个好?

我不是说在运行时间方面,而是“生成”的熵量 - 它也在周期性概念中滚动(低周期=低熵)。

RNG可以证明是最佳的吗?或者这是一个无法实现的目标?通过最优,我的意思是任何序列都可能并且与过去或未来的结果无关。

我对算法感兴趣,而不是宇宙背景采样设备或其他物理“随机性”来源(它是随机的还是复杂的?)

6 个答案:

答案 0 :(得分:9)

请参阅http://www.random.org/analysis/

唯一的最佳RNG:

答案 1 :(得分:6)

美国国家标准与技术研究院对此有一些很好的信息:

http://csrc.nist.gov/groups/ST/toolkit/rng/index.html

看起来有一个测试套件和许多好的参考资料

答案 2 :(得分:3)

旧的测试标准曾经是“Diehard测试”。 http://en.wikipedia.org/wiki/Diehard_tests这已被DKnight指出的NIST测试所取代:http://csrc.nist.gov/groups/ST/toolkit/rng/index.html。 Diehard wiki文章为您提供了一个很好的概述。 NIST位需要更多挖掘。

正如您所说,没有伪RNG(算法)可以被证明是最佳的。它们都具有种子值,并且依赖于输入来生成值。如果你知道种子和状态,你知道下一个值。例如,请查看http://en.wikipedia.org/wiki/Mersenne_twister。我喜欢它主要是因为名字很棒,但文章很好地解释了PRNG的原则。

答案 3 :(得分:3)

计算复杂性理论有一个客观的定义:区分输出和随机数据所需的渐近时间复杂度。

一个好的PRNG应该迫使鉴别者花更多的时间随着种子的大小增加或随着所需的确定性水平的增加而增加。 (对于固定大小的种子,我想你会看到实际的运行时间以及程序的复杂性。)

  • 为了将一个PRNG与另一个PRNG进行比较,具有更小/更快识别器的PRNG更差。
  • 一个常见的假设,即使尚未得到证实,一些PRNG在多项式时间内与随机无法区分。这是'最佳'的一个可能含义。
  • 统计测试,如diehard tests,只是简单的区分。

答案 4 :(得分:1)

基础知识在Knuth,计算机程序设计艺术第2卷,“Seminumerical算法”。这个想法是设计随机性测试,每个测试都试图找到PRNG的非随机方面。请注意,对于人来说似乎是随机的并非如此。例如,我们倾向于说序列'1,4,4,1'例如是非随机的,而它可能在更大的随机序列上完美地发生。

所以方法大致是:

  • 查找随机性的不同测试,这主要是DieHard和NIST测试组。
  • 在PRNG上执行上述测试。
  • 如果PRNG未能通过一项或多项测试,那么PRNG可能会被视为比存活下来的PRNG弱。

测试的一个很好的例子是相空间分析。以下是几年前在不同操作系统的TCP随机生成器上执行的链接:

http://lcamtuf.coredump.cx/oldtcp/tcpseq.html

其他经典测试是卡方,Komolgorov-Smirnoff等,所有这些都在Knuth中解释过。良好的PRNG在任何可以想象的攻击中幸存下来。

答案 5 :(得分:0)

生成数字序列,然后尝试压缩它们。随机性越小,压缩越少。纯随机性是不可压缩的。看到结果会很有意思,如果会有差异的话。