Основы из книги Кнут, «Искусство компьютерного программирования», том 2, «Получисленные алгоритмы». Идея состоит в том, чтобы разработать тесты случайности, где каждый тест будет пытаться найти неслучайные аспекты PRNG. Обратите внимание, что то, что может показаться человеку случайным, не является таковым. Например, мы склонны говорить, что последовательность '1,4,4,1', например, не является случайной, тогда как она может происходить идеально на большей случайной последовательности.
Итак, подход примерно такой:
- Найдите различные тесты на случайность, это по существу группы тестирования DieHard и NIST.
- Выполнить указанные тесты на PRNG.
- Если PRNG не проходит один или несколько тестов, его можно воспринимать как более слабый PRNG, чем выживший.
Крутой пример теста - фазовый анализ. Вот ссылка, выполненная несколько лет назад на генераторах случайности TCP для различных операционных систем:
http://lcamtuf.coredump.cx/oldtcp/tcpseq.html
Другими классическими тестами являются хи-квадраты, Комолгорова-Смирнова и т. Д., Все объясненные в Кнуте. Хорошие PRNG выживают при любой возможной атаке на них.