随机数发生器测试

dev*_*sda 6 testing algorithm unit-testing

如何测试随机数生成器是否生成实际随机数?

我的方法:首先构建一个大小为M的哈希值,其中M是素数.然后取随机数生成器生成的数字,并用M.取出mod并看到它填充所有哈希或仅在某些部分.这是我的方法.我们能用可视化证明它吗?

因为我对测试知之甚少.你能建议我彻底解决这个问题吗?提前致谢

ami*_*mit 11

您应该知道您无法保证随机数生成器正常工作.请注意,即使是在[1,10]范围内的完美均匀分布 - 在10个数字的随机采样中,有10-10的几率获得10倍10.

可能吗?当然不是.

所以-什么可以做什么?

如果随机数发生器确实是均匀分布的,我们可以在统计上证明组合(10,10,......,10)是不可能的.这个概念称为假设检验.通过这种方法,我们可以说"确定性水平为x% - 我们可以拒绝数据来自均匀分布的假设".

一种常见的方法是使用Pearson的Chi-Squared测试,这个想法与你的相似 - 你填写一张表 - 检查每个单元的观察(生成)数字是多少,以及预期的数量是多少零假设下每个单元格的数字(在您的情况下,预期为k/M- 其中M是范围的大小,k是所采用的数字的总数).
然后,您对数据进行一些操作(有关此操作的详细信息,请参阅维基百科文章) - 并获取一个数字(测试统计信息).然后,检查是否可能卡方分布中获取此数字.如果是 - 您不能拒绝原假设,如果不是 - 您可以确定x%确定数据不是来自统一随机生成器.

编辑:示例:
你有一个立方体,你想检查它是否"公平"(均匀分布[1,6]).抛出200次(例如)并创建下表:

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
Run Code Online (Sandbox Code Playgroud)

现在,根据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
Run Code Online (Sandbox Code Playgroud)

对于随机C~ChiSquare(5),那么高于的概率3.9~0.45(这是不可能的)1.

所以我们不能拒绝零假设,我们可以得出结论,数据可能是均匀分布的[1,6]


(1)如果该值小于0.05,我们通常会拒绝零假设,但这非常依赖于案例.