我使用 dieHarder 工具和 ASCII 格式的输入文件,结果没问题,但现在是使用二进制文件的正确时机。当我将随机数据转换为如下所述的 BIN 文件时,在所有测试中都没有看到任何偏差。该文档谈到在我的 UBUNTU 机器上运行时的原始二进制输入格式,但这应该是什么样子?我的文件内容如下:
(UINT32 作为文件中的比特流) 0001110000111111000011101110111001111001010000000101110111111011111010011111001011111100100001...
调用程序为:
顽固分子-g 201 -f
我的输入值的一些示例探针:
473894638 00011100001111110000111011101110
2034261499 01111001010000000101110111111011
3925015684 11101001111100101111110010000100
...
应用该二进制格式文件时,所有 p 值将保持为 0.00000。
我很好奇你是如何编写
.bin
文件的。我猜你用 ASCII 字符写了二进制文件。但 Dieharder 测试需要的不是 PROPER input_file_raw。您应该以字节(二进制)而不是 ASCII 写入文件。这篇文章会对您有所帮助或请评论:)
我用 MT19937 (Mersenne Twister) 测试了几个文件并找出正确的输入文件。
当您要为 Dieharder 测试编写二进制文件时,您应该记住以下两件事。
####...
到numbit: 32
)下面的数据来自Go语言的MT19937(32位,不是64位),种子=0,生成10,000,000个整数。
#==================================================================
# generator MT19937 seed = 0
#==================================================================
type: d
count: 10000000
numbit: 32
2357136044
2546248239
3071714933
3626093760
...
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' 开头。这显示了两件事,没有标头,而且它是小尾数法。
我知道下面的代码对您没有帮助。据我所知,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()
> 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
> 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 个测试(Decimal 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 二进制编写。
恐怕您是用 ASCII 字符编写二进制文件的。如果您可以使用普通文本编辑器(例如 Windows 记事本)查看数据,则意味着您使用 ASCII 字符编写,并且它是不正确的 input_file。因此,您必须以 Little-Endian 二进制形式编写。这篇文章和测试结果证明 Little-Endian 是正确的,并且 input_file_raw 不需要 header。
我不确定“分析测试结果”中Little-Endian和Big-Endian是否有区别。在 NIST SP800-22 中,统计随机性测试是一种“计算 0 或 1 的数量”或“检查是否存在‘0101’、‘001100’等模式”。我认为“TRUTH level”没有区别,这意味着这是否随机生成。
但是,我建议您使用 Little-Endian 编写二进制文件。因为我们不知道测试构建者是否有深刻的理由。我们只是遵循“正确”的使用方向。 :)
在此感谢您的回答。遵循了这里提到的方法,但我仍然面临着顽固分子的问题。我已经在这个 stackoverflow 链接中整理了我遇到的问题:
dieharder - 0-63 之间无符号整数的正确 ASCII 文件格式
感谢这方面的任何帮助。