Как выполнить модульное тестирование генератора псевдослучайных чисел? - PullRequest
31 голосов
/ 09 октября 2008

У меня есть класс генератора псевдослучайных чисел (PRNG), который я хочу протестировать. Есть два подхода:

  1. напишите тестовый набор, который будет отбирать большое количество выборок и проверить, правильно ли они распределены. Такой подход может привести к довольно длительному времени выполнения тестового примера;
  2. вычислить небольшую серию выборок «вручную» и проверить, воспроизводит ли ее алгоритм PRNG. Этот подход может привести к тому, что неслучайная последовательность будет сгенерирована без замечаний;

Я бы сказал, что первый подход на самом деле не является модульным тестированием, потому что он не выполняет тест белого ящика генератора, но, с другой стороны, он правильно проверяет ответственность класса. Второй подход больше похож на реальный модульный тест, ориентированный на алгоритм, но он не дает столько доказательств того, выполняет ли класс свою ответственность.

Какой подход вы предпочитаете и почему?


Ответы [ 13 ]

0 голосов
/ 18 октября 2008

Еще в школе я разрабатывал генератор случайных чисел для имитационного задания, и мне нужен был какой-то способ для определения неслучайности.

У меня появилась блестящая идея взять два случайных числа и построить их график (х, у). Удивительно, как человеческий мозг может обнаружить неслучайные паттерны. («Случайный образец» - оксюморон.)

Я настроил PRNG для удаления полос и всплесков, появившихся на графике, затем нанес на график (log (x), log (y)) для совершенно новой перспективы и повторил процесс.

Позже я был вынужден взять статистику и узнал, что вы можете сделать странную математику, чтобы измерить случайность.

0 голосов
/ 09 октября 2008

Если вы не реализуете заданный алгоритм PNRG, невозможно сказать, что числа случайные, такова природа случайности. да, в среднем, когда ваш генератор чисел уходит в бесконечность, он выровняется, но вы не собираетесь тестировать бесконечное число итераций.

Если вы реализуете известный алгоритм, убедитесь, что первые несколько тысяч чисел совпадают с результатами, которые они предоставляют, с заданным набором начальных чисел. Однако невозможно быть уверенным, поскольку число возможных семян бесконечно.

Вы даже не можете математически доказать, что последовательность чисел является случайной ...

XKCD

alt text

Дилберта

alt text

Модифицируется вниз ...

0 голосов
/ 09 октября 2008

Строго говоря, нет способа проверить, является ли генератор случайных чисел действительно случайным :-) Первый подход дает вам представление о том, может ли он обеспечивать правильное распределение или нет только для фиксированного количества выборок, независимо от того, насколько велика эта сумма. Второй подход может поддержать знание того, ведет ли он себя как алгоритм, но опять же для фиксированного количества выборок.

Лучшее, что вы можете сделать, - использовать оба.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...