这基于this question。提出了一些产生非均匀分布的答案,我开始想知道如何量化输出的非均匀性。我不是在寻找模式问题,只是单一价值方面。
接受的程序是什么?
我目前的想法是通过计算每个值的熵并采用加权平均来计算每次调用的平均Shannon entropy。然后可以将其计算到预期值。
我的担忧是
对于#1我想知道我是否正确。
对于#2,我担心的是我会处理像1/7 +/- 1e-18这样的数字的数字,我担心浮点错误会杀死我,除了最小的问题。计算的确切形式可能会导致一些主要的差异,我似乎记得有一些特殊日志案例的ASM选项,但我似乎无法找到关于此的文档。
在这种情况下,使用范围为[1,n]
的“良好”PRNG,并为范围[1,m]
生成SRNG。问题是结果比输入差多少?
我所拥有的是每个输出值的预期发生率。
答案 0 :(得分:4)
NIST有一套文档和工具,用于统计分析各种指标的随机数生成器。
http://csrc.nist.gov/groups/ST/toolkit/rng/index.html
其中许多测试也被纳入Dieharder PRNG测试套件中。
http://www.phy.duke.edu/~rgb/General/rand_rate.php
有很多不同的指标,因为有许多不同的方式来使用PRNG。您无法在真空中分析PRNG - 您必须了解用例。这些工具和文档提供了大量信息来帮助您,但在一天结束时,您仍需要了解实际需要的内容,然后才能确定算法是否合适。如果有点密集,NIST文档是彻底的。
- 亚当
答案 1 :(得分:1)
This page讨论了一种检查是否得到错误分布的方法:在字段中绘制伪随机值,然后只查看它们。
答案 2 :(得分:0)
TestU01具有比Dieharder更严格的测试装置。最大的测试集称为“BigCrush”,但执行需要很长时间,因此还有一些称为“Crush”和“SmallCrush”的子集。我的想法是首先尝试使用SmallCrush,如果PRNG通过它,请尝试Crush,如果它通过了,那么BigCrush。如果它也通过了,它应该足够好了。
您可以获得TestU01 here。