#random #binary #raw
Вопрос:
Я использую инструмент dieHarder с входными файлами формата ASCII, и результаты в порядке, но сейчас самое подходящее время вместо этого использовать двоичные файлы. Когда я преобразовал свои случайные данные в файл BIN, как описано ниже, во всех тестах не наблюдается смещения. В документации говорится о двоичном формате ввода raw при запуске на моей машине UBUNTU, но как это должно выглядеть ? Содержимое моего файла выглядит следующим образом:
(UINT32 в виде битового потока в файле) 0001110000111111000011101111111110010100000001011111111011111010011111001011111100100001 …
вызовите программу как: dieharder -g 201 -f <myFile.bin> -a<myFile.bin>
некоторые образцы зондов моих входных значений:
473894638
00011100001111110000111011101110
2034261499
01111001010000000101110111111011
3925015684
11101001111100101111110010000100
…
Все значения p останутся на уровне 0,00000 при применении этого файла двоичного формата.
Ответ №1:
Мне любопытно, как вы пишете .bin
файл. Я предполагаю, что вы написали двоичный файл в формате ASCII. Но это не ПРАВИЛЬНЫЙ input_file_raw, который нужен для теста Dieharder. Вы должны записать файл в байтах(двоичном формате), а не в ASCII. Этот пост будет вам полезен или прокомментируйте, пожалуйста 🙂
Я протестировал несколько файлов с помощью MT19937 (Mersenne Twister) и нашел ПРАВИЛЬНЫЙ входной файл.
Когда вы собираетесь писать двоичный файл для теста на выносливость, вы должны иметь в виду следующие 2 вещи.
- Удалить заголовок. (6 строк. От
####...
доnumbit: 32
) - Измените целые числа с ASCII на маленькие конечные байты
Пример теста Dieharder
Приведенные ниже данные взяты из MT19937 (32-разрядные, А НЕ 64-разрядные) на языке Go, с начальным значением=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». Это показывает 2 вещи: нет заголовка, и он имеет небольшой конец.
Код на Голанге
Я знаю, что приведенный ниже код вам не поможет. Насколько я знаю, на языке 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
Результат — пример Литтл-Энди
> 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
Однако вы можете видеть, что между приведенным выше и файлом Big-Endian существует некоторое другое значение P. Это доказывает, что правильный пример Dieharder должен быть написан в двоичном коде Литтл-Энди.
Заключение и комментарии
Я боюсь, что вы написали двоичные файлы в символах ASCII. Если вы можете просматривать данные в обычном текстовом редакторе, таком как Windows-блокнот, это означает, что вы написали в символе ASCII, и это НЕПРАВИЛЬНЫЙ ввод_файла. Поэтому вместо этого вам придется писать в двоичном коде с малым концом. Это сообщение и результаты тестирования доказали, что Литтл-Эндиан прав и input_file_raw не нуждается в заголовке.
Я не уверен, есть ли разница между Литтл-Эндианом и Биг-Эндианом в «Анализе результатов тестов». В NIST SP800-22 статистический тест на случайность-это своего рода «Подсчет числа 0 или 1» или «Проверка наличия шаблона «0101», «001100» и т. Д.». Я думаю, что нет никакой разницы в «уровне ИСТИНЫ», что означает, что это генерируется случайным образом или нет.
Но я рекомендую вам писать двоичные файлы на литтл-эндианском языке. Потому что мы не знаем, есть ли у разработчика тестов глубокая причина или нет.. Мы просто следуем «ПРАВИЛЬНОМУ» направлению использования. 🙂