我很好奇你是怎么写.bin
文件的。我猜你用 ASCII 字符写了二进制文件。但是 Dieharder 测试需要的不是 PROPER input_file_raw。你应该用字节(二进制)而不是 ASCII 写文件。这篇文章将对您有所帮助或请发表评论:)
我用 MT19937 (Mersenne Twister) 测试了几个文件并找出了正确的输入文件。
当你要为 Dieharder 测试编写二进制文件时,你应该记住以下两件事。
- 删除标题。(6 行。从
####...
到numbit: 32
)
- 将整数从 ASCII 更改为Little Endian 字节
Dieharder 测试示例
下面的数据来自 Go 语言的 MT19937(32 位,不是 64 位),种子 = 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' 开头。这显示了两件事,没有 Header 并且是 Little Endian。
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
结果 - Little-Endian 示例
> 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 和 Little-Endian)具有相同的结果(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
但是,您可以看到上述文件和 Big-Endian 文件之间存在一些不同的 P 值。这证明了 Dieharder PROPER 示例应该用 Little-Endian Binary 编写。
结论和评论
恐怕您用 ASCII 字符编写二进制文件。如果您可以使用 Windows 记事本等普通文本编辑器查看数据,则表示您使用 ASCII 字符编写,它是 UN-PROPER input_file。因此,您必须改为使用 Little-Endian Binary 编写。这个帖子和测试结果证明了Little-Endian是正确的,input_file_raw不需要header。
我不确定“分析测试结果”中 Little-Endian 和 Big-Endian 之间是否存在差异。在 NIST SP800-22 中,统计随机性测试是一种“计算 0 或 1 的数量”或“检查是否存在 '0101'、'001100' 等模式”。我认为“TRUTH 级别”没有区别,这意味着这是否会随机生成。
但是,我建议您使用 Little-Endian 编写二进制文件。因为我们不知道测试生成器是否有深刻的原因。我们只是按照“正确”的方向使用。:)