【问题标题】:NIST Randomness Tests requires a sequence of ASCII 0's and 1's but does not accept any trial from MATLABNIST 随机性测试需要一系列 ASCII 0 和 1,但不接受来自 MATLAB 的任何试验
【发布时间】:2013-08-28 12:27:34
【问题描述】:

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

save(...,'-ascii'), fwrite() 和其他一些命令使它工作,但它不接受,它给了我一个segmentation error + igamc: UNDERFLOW error.

如果有人能说出如何创建完全匹配的格式,那就太好了。此外,如果有人知道 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}];

【问题讨论】:

标签: python matlab wolfram-mathematica


【解决方案1】:

我假设您已按照manual 中的说明安装(编译)软件

要了解如何运行该软件,请参阅手册中的第 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)

[提示@Amro,他在下面解释了 cmets 中的备用二进制文件格式。]

将文件放到程序源目录下运行

> ./assess.exe 10000 

或您的系统上的等效项,然后按照提示进行操作。输出位于 \experiments\AlgorithmTesting\

内的文件夹中

您可以使用文件夹 \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)

【讨论】:

  • 这并不完全准确。该工具需要 0/1 序列以二进制格式表示数字;对于 binary fractions 的浮点数。例如,以 10 为底的 0.625 在以 2 为底的 0.101 表示(如:0*2^0 + 1*2^-1 + 0*2^-2 + 1*2^-3)。这就是上面的 Mathematica 代码正在做的事情。当然,它评估的数字远远超出了数值机器的精度(给出的示例中为 302500),所以你需要符号数学工具箱来做类似的事情..
  • 首先,谢谢你努力的回答,真的很好。 ./assess 10000 只是一个小点,它是运行代码的方式。我其实还有一些问题。例如,我找不到任何解释如何检查代码是否正常工作。确实有一些基本的测试技术,例如给出全一或全零一模式来检查特定测试。但是,有没有办法一次检查所有的测试来判断我们是否可以信任代码?
  • 对于其他评论,我认为 Amro 所说的是正确的,但这只是一个示例,我认为提供长序列的 1 和 0 是随机性测试的唯一必要点。如果您能以某种方式告诉我将使用 Save 命令创建的文件格式,我会上传代码,因为当我检查他们的示例文件时,会有一些空白并输入 25 位序列之间。然而,事实证明你不需要 fprintf,但我仍然需要确认这个命令..
  • @Onur, @TryHard: 好的,我明白了 :) 你正在使用你自己的 0/1 序列,这些序列已经在别处生成。所以我真的下载了这个东西,现在我可以确认data.e中的文件表示;它确实是一个仅包含字符 01 的 ASCII 文本文件(所有空格都被忽略)。从二进制表示转换的第一行确实评估为E = 2.7183:s='101011011111100001010100'; e = sum(2.^(1:-1:-22) .* (s-'0'))
  • @TryHard:这里是用于读取二进制格式文件的相关源代码(摘自src/utilities.c):pastebin.com/mVYq9Wt3(正如他们所说,代码是最好的文档来源) .所以我认为二进制表示将 ASCII 表示中的 0/1 打包成字节位。也就是说,每个 8 0/1 值的序列都写为它们以二进制表示的整数。所以我提到的上一行将写为:fwrite(fid, bin2dec(['10101101';'11111000';'01010100']), '*uint8')
猜你喜欢
  • 2022-11-05
  • 1970-01-01
  • 1970-01-01
  • 2021-12-31
  • 2023-03-30
  • 2013-04-25
  • 1970-01-01
  • 2015-10-05
  • 1970-01-01
相关资源
最近更新 更多