Python NIST随机性测试要求ASCII 0';s和1';但不接受MATLAB的任何试验
我正在尝试使用NIST随机性测试套件对我的长0-1位序列进行随机性测试。 它要求我提供ASCII 0和1或一个二进制文件,每个字节包含8位数据。然而,我试过了Python NIST随机性测试要求ASCII 0';s和1';但不接受MATLAB的任何试验,python,matlab,wolfram-mathematica,Python,Matlab,Wolfram Mathematica,我正在尝试使用NIST随机性测试套件对我的长0-1位序列进行随机性测试。 它要求我提供ASCII 0和1或一个二进制文件,每个字节包含8位数据。然而,我试过了 save(…,'-ascii'),fwrite()和一些其他命令使其工作,但它不接受,并给我一个分段错误+igamc:UNDERFLOW错误。 如果有人能说如何创建精确匹配的格式,这将是非常好的。此外,如果有人知道MATHEMATICA,他们从MATHEMATICA创建了自己的示例文件,如下所示,也许这可以帮助了解格式,您可以告诉我在MA
save(…,'-ascii')
,fwrite()
和一些其他命令使其工作,但它不接受,并给我一个分段错误
+igamc:UNDERFLOW错误。
如果有人能说如何创建精确匹配的格式,这将是非常好的。此外,如果有人知道MATHEMATICA,他们从MATHEMATICA创建了自己的示例文件,如下所示,也许这可以帮助了解格式,您可以告诉我在MATLAB中做什么
BinExp[num_,d_] := Module[{n,L},
If[d > $MaxPrecision, $MaxPrecision = d];
n = N[num,d];
L = First[RealDigits[n,2]]
];
SE = BinExp[E,302500];
Save["data.e",{SE}];
我假设您已经按照中的说明安装(编译)了软件 要了解如何运行软件,请在手册的第5.3节中启动 您可以在matlab中生成随机0/1的ascii文件,如下所示:
N=10000; % <-- length of sequence
seq = rand(N,1)>0.5;
fid=fopen('test.txt','w','native');
fprintf(fid,'%d',seq)
fclose(fid)
或系统上的同等产品,并按照提示进行操作。输出位于\experiments\AlgorithmTesting中的文件夹中\
您可以使用folder\data中的测试数据评估程序,并与附录B中列出的结果进行比较,例如,此处使用data.pi中pi的ASCII格式代表:
> ./assess.exe 1000000
0 [data source?]
.\data\data.pi [path to file?]
1 [tests?]
0 [adjust pars?]
1 [bitstreams?]
0 [ASCII?]
编辑
以下是Amro关于如何将0/1的字符串数组a写为二进制的解释(未经测试):
fid=fopen('test.txt','w','native');
fwrite(fid, bin2dec(reshape(num2str(A),[],8)), 'uint8')
fclose(fid)
你能提供一个到测试站点的链接吗?你能为我的问题提供一个建议吗?FWIW mathematica代码生成一个带有mathermatica格式列表表达式的asci文件:
SE={1,0,1,0…}
(行环绕80列左右)。这并不准确。该工具需要0/1的序列,表示二进制格式的数字;对于浮点,这是一个很好的例子。例如,基数10中的0.625
表示为基数2中的0.101
(如:0*2^0+1*2^-1+0*2^-2+1*2^-3
)。这就是上面的Mathematica代码所做的。当然,它计算的数字远远超过了数字机器的精度(给出的例子中是302500),所以你需要符号数学工具箱来做类似的事情。首先,感谢你努力给出你的答案,它真的很好。这只是运行代码的一个小问题。实际上我还有一些问题。例如,我找不到任何关于如何检查代码是否正常工作的解释。确实有一些基本的测试技术,比如给出所有1或所有零一模式来检查特定的测试。然而,有没有一种方法可以一次检查所有的测试,以确定我们是否可以信任代码?另一方面,Amro所说的我认为是正确的,但这只是一个例子,我认为提供长序列的1和0是随机性测试的唯一必要点。我上传代码,如果你能告诉我将用Save命令创建的文件格式,因为当我检查他们的示例文件时,在25位序列之间有一些空格和输入。然而,事实证明,fprintf不需要这样做,但我仍然需要对该命令进行确认。@Onur,@TryHard:好的,我明白了:)您正在使用您自己的0/1序列,该序列已经在别处生成。所以我实际上下载了这个东西,现在我可以确认data.e
中的文件表示形式;它实际上是一个ASCII文本文件,只包含字符0
或1
(忽略所有空白)。从二进制表示转换时,第一行的计算结果为E=2.7183
:s='1010110111100001010100';e=sum(2.^(1:-1:-22.*(s-'0'))
@TryHard:以下是用于读取二进制格式文件的相关源代码(摘自src/utilities.c
):(正如他们所说,代码是最好的文档来源)。因此,我认为二进制表示将ASCII表示的0/1压缩为字节位。也就是说,8个0/1值的每个序列都被写为它们在二进制中表示的整数。所以我前面提到的那一行写为:fwrite(fid,bin2dec(['10101101';'11111000';'01010100']),'*uint8')
fid=fopen('test.txt','w','native');
fwrite(fid, bin2dec(reshape(num2str(A),[],8)), 'uint8')
fclose(fid)