jj1*_*bdx 10
您无论如何都只能测试统计随机性,而这并不能证明数字序列是否具有加密强度.统计测试PRNG需要相当多(10或甚至100G字节)的生成位.
Dieharder是一个非常好的测试套件.
http://www.phy.duke.edu/~rgb/General/dieharder.php
而TestU01也是众所周知的.
http://www.iro.umontreal.ca/~simardr/testu01/tu01.html
以下是如何开始的详细说明.任何RNG的初步测试是NIST使用的Monobit测试,它只计算1和0的数量. http://csrc.nist.gov/groups/ST/toolkit/rng/stats_tests.html
关于测试随机数生成器的注意事项:我们实际上不需要太多RNG测试,因为许多"包含"彼此.
也就是说,这里描述的是一种简单有效的新的有序频率测试.该测试包含任何预期50-50的频率测试,因为它更严格.
定义:t = tosses/trials b = bins/urns s = tosses的会话n =会话集
因为掷硬币通常不是50-50,所以使用40,000,000位的游泳池可以非常有效地利用这项新测试.
当硬币翻转100次时,预期值为53.9795的一个和46.0205的另一个,有时更多的头,有时更多的尾巴.50-50不是有序箱的预期值,因此该测试优于任何频率测试,而不是预期50-50.
第1步:选择样本大小:100次/位.
第2步:选择会话数量:50个会话永远不够,即使数百万的样本量很大.400通常就足够了.2000收敛良好,因此使用了2000个不同的100个样本的样本.最小增益发生在2000以上.
2000次100次投掷的预期值:50-50 159.1784748(注意50-50只发生在7.96%的时间.)51-49 312.1146564 52-48 294.1080416 53-47 266.362 54-46 231.8335926 55-45 193.8971865 56 -44 155.8102392 57-43 120.2745706 58-42 89.16907819 59-41 63.47629295 60-40 43.37546685 61-39 28.4429291 62-38 17.89152 63-37 10.79171042 64-36 6.238957586 65-35 3.455422663
66-34 1.832421109 67或更高1.747439674
获得b = 2和t = 30的精确百分比的公式为:对于100-0,赔率为1 /(2 ^ 99)= 1 /(2 ^(t-1))然后,建立从那里,99-1先前乘以100(t)除以1为98-2先前乘以99(t-1)除以2为97-3先前乘以98(t-2)除以3. ..跳过...对于51-49之前的乘以52(t-48)除以49为50-50之前乘以51(t-49)除以50,然后再除以2.
该等式适用于任意数量的投掷.
步骤3:对这18个值进行卡方检验,得到17个自由度,得到p值.
高于0.999的p值接近完美.RNG太过接近完美吗?是的,太可预测了.0.001以下是通常会出现明确问题的地方.一个测试套件将小数点右边的300个零视为无穷小,连续10-14个非常糟糕.有些人认为6个零已足够严重,无法成为明确的明确失败.为安全起见,有些人会考虑1或2个零而且它们是错误的.因此,对于单个集合而言,有时为优秀的RNG提供低于0.01的p值,而不是单个p值,而是采用了多组会话.
步骤4:将p值送入0-1.0直线Kolmogorov-Smirnov检验.不同的专家建议KS测试的输入数量从10到1000. 100还不够.200很好.500略有攻击性.
这是伪代码以获得KS的最大差异:
Set low := 0; Set n := 200;
Set ansForward := 0; Set ansBack := 0;
sort( pval [n] );
for (j := 0; j < n; j := j+1)
{ Set Kback := pval [ j ] - low;
Set low := low +1 / n; { Ranges from 0 to 1 }
Set Kforward := low - pval [ j ];
if (Kforward > ansForward) Set ansForward := Kforward;
if (Kback > ansBack) Set ansBack := Kback;
}
{ Separate analysis can perhaps be made here on ansForward and ansBack. Someone like Peter Brand might also examine and magnify the bottom 5% and the top 5%. }
if (ansForward > ansBack)
return ansForward;
else
return ansBack; ?
Run Code Online (Sandbox Code Playgroud)
KS答案不是p值,200 p值不应超过0.115.对于良好的RNG,0.03至0.08是正常的.0.115至0.13是可疑的.
KS测试非常简单它也非常有效.
上面显示的是一种优越的新型有序频率测试.任何未通过此测试的RNG都不应进一步测试并立即更换.但是,接下来呢?
OFTest不包含LOR测试.推荐的是运行长度测试,样本量为200,000,其中15个自由度进入KS测试200次.(注意,"大于j"的最小LOR bin的预期总数等于第j个bin.)
然后什么?对于许多游戏,这两个测试都是您需要的.NIST,Diehard,Dieharder,Crusher倾向于选择.(注意:Diehard Overlapping Sums测试既低劣又有缺陷,而不是对Marsaglia原始Fortran代码的忠实解释.)
来自少数RNG的结果,n = 200.
LCG 134775813x + 1 mod 2 ^ 31 seed = 11111:高位:OFT KS:0.0841通过.LOR KS:0.04786通过.第一个200,000的单比特:-189通行证.位16:OFT KS:0.5477失败.第一个200,000:114通行证的单比特.0到15之间的所有位都无法通过OFT,但是通过了Monobit测试.
常见的LCG Randu:65539x + 0 mod 2 ^ 31 seed = 11111:
高位:OFT KS:0.03567 LOR KS:0.07709.第一个200,000的单比特:-165比特18:OFT KS:0.15143第一个200,000的单比特:+204 0到17的所有比特都不能通过OFT.
LCG 69069x + 1 mod 2 ^ 32 seed = 11111:高位:OFT KS:0.05547 LOR KS:0.0456单位数20000:-290位17:OFT KS:0.1467单位数20000:-193 0到13之间的所有位均未通过OFT.
LCG 3141592653x + 2718281829 mod 2 ^ 35 seed = 11111:高位:OFT KS:0.02868 LOR KS:0.06117单位数为200,000:-69位16:OFT KS:0.240单位数为200,000:-13 0到15之间的所有位均未通过OFT.
LCG 23x + 0 mod 2 ^ 27 seed = 11111:高位:OFT KS:0.5368单位数为200,000:-235所有位都未通过OFT.
请注意,应该从返回的结果中丢弃任何和每个LCG的低位.
关于2 ^ 35的注释:这是任何RNG的最小周期和重要性,因为硬币翻转和掷骰子运行并且这样的事情可能连续发生30次,但预计不会发生35次.2 ^ 32的时期不足,对于现实生活情况来说太小.
LWAP
如何确保生成的数字是随机的。
您无法确定,使用有限数量的测试无法确定地将任何函数与随机数生成器区分开来。但是你可以做统计分析:
那么,如果无法明确证明随机性,我们可以做些什么呢?实用的方法是从给定的生成器中获取许多随机数序列,并对它们进行一系列统计测试。随着序列通过更多的测试,数字随机性的置信度增加,生成器的置信度也增加。然而,因为我们期望一些序列看起来是非随机的(比如我们骰子上的 10 个 6 卷),我们应该期望一些序列至少在某些测试中失败。但是,如果许多序列未通过测试,我们应该怀疑。这也是您直观地测试骰子是否已加载的方式:多次滚动,如果您看到太多相同值的序列出现,您应该怀疑。
有关您可以运行的测试的更多详细信息,请参阅Charmaine Kenny的研究部分。
这是一件非常困难的事情。
您可以尝试Fourmilab的ENT并将其与他们的 RNG、HotBits的结果进行比较。您可能还想查看Random.org。
这看起来也很有趣:Diehard 测试(不过我还没有使用过它)。
归档时间: |
|
查看次数: |
26785 次 |
最近记录: |