我使用dieHarder工具与ASCII格式的输入文件和结果是OK的,但现在是正确的时间使用二进制文件代替。当我将随机数据转换为如下所述的BIN文件时,在所有测试中都看不到BIAS。文档提到了在我的UBUNTU机器上运行时的原始二进制输入格式,但是这应该是什么样子?我的文件内容如下:
(UINT32作为文件中的比特流)0001110000111111000011101110111001111001010000000101110111111011111010011111001011111100100001…
调用程序如下:didihard -g 201 -f <——
我的输入值的一些示例探测:
47389463800011100001111110000111011101110
203426149901111001010000000101110111111011
392501568411101001111100101111110010000100
…
当应用二进制格式文件时,所有p值将保持为0.00000。
我很好奇你是如何写.bin
文件的。我猜你写的二进制文件在ASCII字符。但它不是适当的input_file_raw, Dieharder测试需要。你应该以字节(二进制)写文件不是ASCII。这篇文章会对你有帮助的,请评论:)
我用MT19937 (Mersenne Twister)测试了几个文件,找到了合适的输入文件。
当你要为Dieharder测试编写二进制文件时,你应该记住以下两点:
- 删除标题。(6行。从
####...
到numbit: 32
) - 将整数从ASCII改为小端字节
Dieharder测试例
以下数据来自go语言MT19937(32位,非64位),seed=0,生成10,000,000个整数
(十进制)ASCII示例
#==================================================================
# generator MT19937 seed = 0
#==================================================================
type: d
count: 10000000
numbit: 32
2357136044
2546248239
3071714933
3626093760
...
二进制文件示例
这是屏幕截图,我是否可以看到与VSCode-HexEditor
AC 0A 7F 8C 2F AA C4 97 75 A6 16 B7 C0 CC 21 D8
43 B3 4E 9A FB 52 A2 DB C3 76 7D 8B 67 7D E5 D8
09 A4 74 6C D3 DE A1 9F 15 51 59 A5 F2 D6 66 62
24 B7 05 70 57 3A 2B 4C 46 3C 4B E4 D8 BD 84 0E
58 9A B2 F6 8C CD CC 45 3A 39 29 62 C1 42 48 7A
E6 7D AE CA 27 4A EA CF 57 A8 65 87 AE C8 DF 7A
58 5E 6B 91 51 8B 8D 64 A5 E6 F3 EC 19 42 09 D6
...
第一个数据2357136044 = 0x8C7F0AAC
您可以看到前4个字节以'AC' '0A' '7F' '8C'开头。这说明了两件事,没有头文件,而且是小端序.
Golang代码
我知道下面的代码对你没有帮助。据我所知,go语言中没有官方的Pure-MT19937生成器。因此,我自己从wiki中的伪代码移植到go语言(1.17.1)。
littleEndianFile, err := os.Create("./MT19937_LittleEndian.bin")
littleEndianFileBuffer := bufio.NewWriter(littleEndianFile)
littleEndianByte := make([]byte, 4)
// Generate MT19937 on my own.
test := NewMT19937(0)
newInt32 := test.NextUint32()
binary.LittleEndian.PutUint32(littleEndianByte, newInt32)
for _, eachByte := range littleEndianByte {
littleEndianFileBuffer.WriteByte(eachByte)
}
littleEndianFileBuffer.Flush()
结果-(十进制)ASCII示例
> dieharder -a -g 202 -f ./generated/MT19937_10000000.dat
#=============================================================================#
# dieharder version 3.31.1 Copyright 2003 Robert G. Brown #
#=============================================================================#
rng_name | filename |rands/second|
file_input|./generated/MT19937_10000000.dat| 7.79e+06 |
#=============================================================================#
test_name |ntup| tsamples |psamples| p-value |Assessment
#=============================================================================#
diehard_birthdays| 0| 100| 100|0.63638992| PASSED
diehard_operm5| 0| 1000000| 100|0.00012670| WEAK
diehard_rank_32x32| 0| 40000| 100|0.93085433| PASSED
diehard_rank_6x8| 0| 100000| 100|0.07088597| PASSED
diehard_bitstream| 0| 2097152| 100|0.10456387| PASSED
Result - Little-Endian example
> dieharder -a -g 201 -f ./generated/MT19937_10000000_LittleEndian.bin
#=============================================================================#
# dieharder version 3.31.1 Copyright 2003 Robert G. Brown #
#=============================================================================#
rng_name | filename |rands/second|
file_input_raw|./generated/MT19937_10000000_LittleEndian.bin| 5.60e+07 |
#=============================================================================#
test_name |ntup| tsamples |psamples| p-value |Assessment
#=============================================================================#
diehard_birthdays| 0| 100| 100|0.63638992| PASSED
diehard_operm5| 0| 1000000| 100|0.00012670| WEAK
diehard_rank_32x32| 0| 40000| 100|0.93085433| PASSED
diehard_rank_6x8| 0| 100000| 100|0.07088597| PASSED
diehard_bitstream| 0| 2097152| 100|0.10456387| PASSED
你可以看到上面的2个测试(十进制ASCII和小端)有相同的结果(p值)
结果-大端例子
> dieharder -a -g 201 -f ./generated/MT19937_10000000_BigEndian.bin
#=============================================================================#
# dieharder version 3.31.1 Copyright 2003 Robert G. Brown #
#=============================================================================#
rng_name | filename |rands/second|
file_input_raw|./generated/MT19937_10000000_BigEndian.bin| 5.65e+07 |
#=============================================================================#
test_name |ntup| tsamples |psamples| p-value |Assessment
#=============================================================================#
diehard_birthdays| 0| 100| 100|0.46325487| PASSED
diehard_operm5| 0| 1000000| 100|0.00000093| FAILED
diehard_rank_32x32| 0| 40000| 100|0.93085433| PASSED
diehard_rank_6x8| 0| 100000| 100|0.27138035| PASSED
diehard_bitstream| 0| 2097152| 100|0.75581067| PASSED
diehard_opso| 0| 2097152| 100|0.25961325| PASSED
diehard_oqso| 0| 2097152| 100|0.00025268| WEAK
然而,你可以看到上面和大端文件之间有一些不同的p值。这证明了Dieharder PROPER的例子应该用Little-Endian Binary来写。
结论及点评
恐怕你写的二进制文件是ASCII字符。如果你可以看到数据与普通的文本编辑器,如windows -记事本,这意味着你写在ASCII字符,它是不适当的input_file。所以,你必须用小端二进制来写。这篇文章和测试结果证明Little-Endian是正确的,input_file_raw不需要header。
我不确定在"分析测试结果"中Little-Endian和Big-Endian是否有区别。在NIST SP800-22中,统计随机性检验是一种"计数0或1的个数"。或"检查是否有'0101','001100'等图案";我认为"真理水平"没有区别,这意味着这产生随机或非。
但是,我建议您使用Little-Endian编写二进制文件。因为我们不知道测试者是否有深刻的理由。我们只需要遵循"属性"使用说明。:)