您将如何测试随机数生成器是否正在生成实际的随机数?
我的方法:首先建立一个大小为M的散列,其中M是素数。然后取由随机数生成器生成的数字,并用M取mod,然后看它是否填充了所有散列或仅填充了一部分。那是我的方法。我们可以通过可视化证明吗?
由于我对测试的了解很少。您能建议我彻底解决这个问题吗?提前致谢
您应该意识到,您不能 保证 随机数生成器正常工作。请注意,即使是[1,10]范围内的完美均匀分布- 在10个数字的随机采样中,也有10 -10的机会得到10乘以10。
有可能吗 当然不是。
所以-什么 可以 做什么?
我们可以从 统计学上证明 ,如果随机数生成器确实均匀分布,则组合(10,10,....,10) 不太可能 。这个概念称为 假设检验 。通过这种方法,我们可以说“具有x%的确定性水平-我们可以拒绝数据取自均匀分布的假设”。
这样做的一种常见方法是使用 Pearson的Chi- Squared检验 ,这个想法与您的相似-填写表格-检查每个单元格 观察到的 (生成的)数目是多少, 预期的 数目是多少空假设下每个像元的数字(在您的情况下,期望值为k/M-,其中M是范围的大小,k是所取数字的总数)。 然后,您可以对数据进行一些操作(有关更多信息,请参阅Wikipedia文章,以了解该操作的确切含义)-并获得一个数字(测试统计量)。然后,您检查此数字是否 可能 来自卡方分布。如果是,则不能拒绝原假设,如果不能,则可以x%的确定性确定数据不是来自统一随机生成器。
k/M
编辑: 示例: 您有一个多维数据集,并且要检查它是否“公平”(在中均匀分布[1,6])。将其抛出200次(例如)并创建下表:
[1,6]
number: 1 2 3 4 5 6 empirical occurances: 37 41 30 27 32 33 expected occurances: 33.3 33.3 33.3 33.3 33.3 33.3
现在,根据Pearson的检验,统计量为:
X = ((37-33.3)^2)/33.3 + ((41-33.3)^2)/33.3 + ... + ((33-33.3)^2)/33.3 X = (18.49 + 59.29 + 10.89 + 39.69 + 1.69 + 0.09) / 33.3 X = 3.9
对于随机C~ChiSquare(5),中较高,则概率3.9是~0.45(这不是不可能)1。
C~ChiSquare(5)
3.9
~0.45
因此我们 不能 拒绝原假设,并且可以得出结论,数据 可能 均匀地分布在[1,6]
(1)如果值小于0.05,我们通常会拒绝原假设,但这在很大程度上取决于情况。