Python NIST随机性测试要求ASCII 0';s和1';但不接受MATLAB的任何试验

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

我正在尝试使用NIST随机性测试套件对我的长0-1位序列进行随机性测试。 它要求我提供ASCII 0和1或一个二进制文件,每个字节包含8位数据。然而,我试过了

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)