Введение
Батарея статистических тестов
Тесты Diehard – это батарея статистических тестов для оценки качества генератора случайных чисел. Они были разработаны Джорджем Марсаглией на протяжении нескольких лет и впервые опубликованы в 1995 году на CD-ROM со случайными числами. В 2006 году оригинальные тесты Diehard были расширены и преобразованы в тесты Dieharder.
The diehard tests are a battery of statistical tests for measuring the quality of a random number generator. They were developed by George Marsaglia over several years and first published in 1995 on a CD ROM of random numbers. In 2006, the original diehard tests were extended into the dieharder tests.
История
Первоначальный набор тестов на случайность для ГСЧ был предложен в 1969 году в первом издании книги Дональда Кнута «Искусство компьютерного программирования» (том 2, глава 3.3: Статистические тесты). Позднее тесты Кнута были вытеснены тестами Diehard, разработанными Джорджем Марсальей в 1995 году и состоящими из пятнадцати различных проверок. Невозможность изменять параметры тестов или добавлять новые привела к разработке библиотеки TestU01, представленной в 2007 году Пьером Л’Экуьером и Ричардом Симардом из Монреальского университета.
Обзор испытаний
Расстояния между днями рождения Выберите случайные точки на большом интервале. Расстояния между точками должны быть асимптотически экспоненциально распределены. Название основано на парадоксе дней рождения. Перекрывающиеся перестановки Анализируйте последовательности из пяти последовательных случайных чисел. 120 возможных упорядочений должны возникать со статистически равной вероятностью. Ранги матриц Выберите некоторое количество битов из некоторого количества случайных чисел, чтобы сформировать матрицу над {0,1}, затем определите ранг матрицы. Подсчитайте ранги. Тесты с обезьянами Рассматривайте последовательности из некоторого количества битов как «слова». Подсчитайте перекрывающиеся «слова» в потоке. Количество «слов», которые не встречаются, должно следовать известному распределению. Название основано на теореме о бесконечной обезьяне. Подсчет единиц Подсчитайте количество единичных битов в каждом из последовательных или выбранных байтов. Преобразуйте счетчики в «буквы» и подсчитайте количество «слов» из пяти букв. Тест с парковкой Случайно разместите единичные окружности в квадрате 100x100. Окружность считается успешно припаркованной, если она не перекрывает существующую успешно припаркованную окружность. После 12 000 попыток количество успешно припаркованных окружностей должно следовать определенному нормальному распределению. Тест на минимальное расстояние Случайно разместите 8000 точек в квадрате 10000x10000, затем найдите минимальное расстояние между парами точек. Квадрат этого расстояния должен быть экспоненциально распределен с определенным средним значением. Тест случайных сфер Случайным образом выберите 4000 точек в кубе с ребром 1000. Поместите сферу в центр каждой точки, радиус которой равен минимальному расстоянию до другой точки. Объем наименьшей сферы должен быть экспоненциально распределен с определенным средним значением. Тест сжатия Умножайте 231 на случайные вещественные числа, пока не достигнете 1. Повторите это 100 000 раз. Количество вещественных чисел, необходимых для достижения 1, должно следовать определенному распределению. Тест на перекрытие сумм Сгенерируйте длинную последовательность случайных вещественных чисел. Сложите последовательности из 100 последовательных вещественных чисел. Суммы должны быть нормально распределены с определенным средним и дисперсией. Тест на серии Сгенерируйте длинную последовательность случайных вещественных чисел. Подсчитайте количество возрастающих и убывающих серий. Количество серий должно следовать определенному распределению. Тест на кости Сыграйте в 200 000 партий в кости, подсчитывая выигрыши и количество бросков в каждой игре. Каждый счет должен следовать определенному распределению.
Описание испытаний
Тест на разряженность дней рождения. Выберите m дней рождения в году из n дней. Перечислите разности между днями рождения. Если j — это количество значений, которые встречаются более одного раза в этом списке, то j асимптотически распределено по Пуассону со средним. Опыт показывает, что n должно быть достаточно большим, скажем, n ≥ 2, для сравнения результатов с распределением Пуассона с этим средним. В этом тесте используется n = 2 и m = 2, так что базовое распределение для j принимается за пуассоновское с выбором выборки из 500 значений j, а тест согласия хи-квадрат дает p-значение. В первом тесте используются биты 1–24 (считая слева) из целых чисел в указанном файле. Затем файл закрывается и открывается заново. Далее биты 2–25 используются для предоставления дат рождения, затем 3–26 и так далее до битов 9–32. Каждый набор битов дает p-значение, а девять p-значений дают выборку для KSTEST. Тест на перекрытие 5 перестановок. Это тест OPERM5. Он рассматривает последовательность из одного миллиона 32-битных случайных целых чисел. Каждый набор из пяти последовательных целых чисел может находиться в одном из 120 состояний, соответствующих 5! возможным порядкам пяти чисел. Таким образом, пятое, шестое, седьмое числа каждое определяют состояние. Поскольку наблюдается много тысяч переходов состояний, производится кумулятивный подсчет количества случаев каждого состояния. Затем квадратичная форма в слабой обратной матрице ковариации 120×120 дает тест, эквивалентный тесту отношения правдоподобия, что количество клеток 120 произошло из указанного (асимптотически) нормального распределения с указанной матрицей ковариации 120×120 (с рангом 99). Эта версия использует 1000000 целых чисел дважды. В этом тесте могут быть неразрешенные ошибки, приводящие к последовательно плохим p-значениям. Тест бинарного ранга для матриц 31×31. 31 бит из 31 случайного целого числа из тестовой последовательности используются для формирования бинарной матрицы 31×31 над полем {0, 1}. Определяется ранг. Этот ранг может быть от 0 до 31, но ранги < 28 встречаются редко, и их количество объединяется с количеством для ранга 28. Ранги находятся для 40000 таких случайных матриц, и выполняется тест хи-квадрат по подсчетам для рангов 31, 30, 29 и ≤ 28. Тест бинарного ранга для матриц 32×32. Формируется случайная бинарная матрица 32×32, каждая строка которой является 32-битным случайным целым числом. Определяется ранг. Этот ранг может быть от 0 до 32, ранги меньше 29 встречаются редко, и их количество объединяется с количеством для ранга 29. Ранги находятся для 40000 таких случайных матриц, и выполняется тест хи-квадрат по подсчетам для рангов 32, 31, 30 и ≤ 29. Тест бинарного ранга для матриц 6×8. Из каждого из шести случайных 32-битных целых чисел из генератора, подвергающегося тестированию, выбирается указанный байт, и полученные шесть байтов образуют бинарную матрицу 6×8, ранг которой определяется. Этот ранг может быть от 0 до 6, но ранги 0, 1, 2, 3 встречаются редко; их количество объединяется с количеством для ранга 4. Ранги находятся для 100000 случайных матриц, и выполняется тест хи-квадрат по подсчетам для рангов 6, 5 и ≤ 4. Тест битового потока. Файл, который тестируется, рассматривается как поток битов. Назовем их b, b, … Рассмотрим алфавит с двумя "буквами" 0 и 1 и представьте себе поток битов как последовательность из 20 перекрывающихся "слов". Таким образом, первое слово — bb…b, второе — bb…b и так далее. Тест битового потока подсчитывает количество отсутствующих 20-буквенных (20-битных) слов в строке из двух перекрывающихся 20-буквенных слов. Существует 2 возможных 20-буквенных слова. Для действительно случайной строки из 2 + 19 бит количество отсутствующих слов j должно быть (очень близко) нормально распределено со средним 141909 и сигмой 428. Таким образом, (j - 141909) / 428 должен быть стандартной нормальной переменной (z-оценка), приводящей к равномерному p-значению [0, 1). Тест повторяется двадцать раз. Тесты OPSO, OQSO и DNA. OPSO означает перекрывающиеся пары с редкой заполненностью. В тесте OPSO рассматриваются слова из 2 букв алфавита из 1024 букв. Каждая буква определяется десятью битами из 32-битного целого числа в последовательности, подлежащей проверке. OPSO генерирует 2 (перекрывающихся) двухбуквенных слова (из 2 + 1 "нажатия клавиши") и подсчитывает количество отсутствующих слов — то есть двухбуквенных слов, которые не появляются во всей последовательности. Это количество должно быть очень близко к нормальному распределению со средним 141909 и сигмой 290. Таким образом, (missingwrds - 141909) / 290 должна быть стандартной нормальной переменной. Тест OPSO берет 32 бита за раз из тестового файла и использует указанный набор из десяти последовательных битов. Затем он перезапускает файл для следующих десяти битов и так далее. OQSO означает перекрывающиеся четверки с редкой заполненностью. Тест OQSO аналогичен, за исключением того, что он рассматривает слова из 4 букв алфавита из 32 букв, каждая буква определяется указанной строкой из 5 последовательных битов из тестового файла, элементы которого являются 32-битными случайными целыми числами. Среднее количество отсутствующих слов в последовательности из 2 четырехбуквенных слов (2 + 3 "нажатия клавиши") снова равно 141909, с сигмой = 295. Среднее основано на теории, сигма получена путем обширного моделирования. Тест DNA рассматривает алфавит из 4 букв C, G, A, T, определяемых двумя указанными битами в последовательности случайных целых чисел, подвергающихся тестированию. Он рассматривает слова из 10 букв, так что, как в OPSO и OQSO, существует 2 возможных слова, а среднее количество отсутствующих слов из строки из 2 (перекрывающихся) 10-буквенных слов (2 + 9 "нажатий клавиши") равно 141909. Стандартное отклонение сигма = 339 было определено, как для OQSO, путем моделирования. (Сигма для OPSO, 290, является истинным значением (с точностью до трех знаков), не определенным путем моделирования). Тест подсчета единиц в потоке байтов. Рассмотрим тестовый файл как поток байтов (по четыре на 32-битное целое число). Каждый байт может содержать от нуля до восьми единиц с вероятностями 1, 8, 28, 56, 70, 56, 28, 8, 1 из 256. Теперь пусть поток байтов предоставляет строку перекрывающихся 5-буквенных слов, каждая "буква" принимает значения A, B, C, D, E. Буквы определяются количеством единиц в байте: 0, 1 или 2 дают A, 3 дает B, 4 дает C, 5 дает D, а 6, 7 или 8 дают E. Таким образом, у нас есть обезьяна на пишущей машинке, нажимающая пять клавиш с различными вероятностями (37, 56, 70, 56, 37 из 256). Существует 55 возможных 5-буквенных слов, и из строки из 256000 (перекрывающихся) 5-буквенных слов производится подсчет частот для каждого слова. Квадратичная форма в слабой обратной матрице ковариации подсчетов ячеек дает тест хи-квадрат Q5–Q4, разность наивных сумм Пирсона по подсчетам для 5- и 4-буквенных ячеек. Тест подсчета единиц для конкретных байтов. Рассмотрим тестовый файл как поток 32-битных целых чисел. Из каждого целого числа выбирается конкретный байт, например, крайние левые биты 1–8. Каждый байт может содержать от 0 до 8 единиц с вероятностями 1, 8, 28, 56, 70, 56, 28, 8, 1 из 256. Теперь пусть указанные байты из последовательных целых чисел предоставляют строку (перекрывающихся) 5-буквенных слов, каждая "буква" принимает значения A, B, C, D, E. Буквы определяются количеством единиц в этом байте: 0, 1 или 2 → A, 3 → B, 4 → C, 5 → D и 6, 7 или 8 → E. Таким образом, у нас есть обезьяна на пишущей машинке, нажимающая пять клавиш с различными вероятностями 37, 56, 70, 56, 37 из 256. Существует 5 возможных 5-буквенных слов, и из строки из 256000 (перекрывающихся) 5-буквенных слов производится подсчет частот для каждого слова. Квадратичная форма в слабой обратной матрице ковариации подсчетов ячеек дает тест хи-квадрат Q5 – Q4, разность наивных сумм Пирсона по подсчетам для 5- и 4-буквенных ячеек. Тест парковки. В квадрате со стороной 100 случайно "припаркуйте" автомобиль — круг радиусом 1. Затем попытайтесь припарковать 2-й, 3-й и так далее, каждый раз паркуясь "на слух". То есть, если попытка припарковать автомобиль приводит к столкновению с уже припаркованным, попробуйте снова в новом случайном месте. (Чтобы избежать проблем с траекторией, рассмотрите возможность парковки вертолетов, а не автомобилей.) Каждая попытка приводит либо к столкновению, либо к успеху, последнему следует увеличение списка уже припаркованных автомобилей. Если мы построим график n: количества попыток, и k: количества успешно припаркованных, мы получим кривую, которая должна быть похожа на те, которые предоставляются идеально случайным числом…