Как покрыть юнит-тестами функцию random?

Предположим, есть функция, которая принимает параметр n и возвращает целые значения в диапазоне от 0 до n включительно (пример, конечно, вырожденный, т.к. функция тривиальная). Как это оттестировать?

Теорию вероятностей я помню очень плохо, но, кажется, даже m вызовов такой функции (при m заведомо большем, чем n) не смогут ничего гарантировать.
9 февраля в 12:57
k12th 43,4

отсортировано по дате по оценке
ответы (6)

+4
bagyr #
en.wikipedia.org/wiki/Diehard_tests

Доказать математически что-то на реальных цифрах не выйдет.
+2
Fesor #
Если у нас выйдет нормальное распределение случайной величины — поидее это гуд. Но я так же давно теорвер не вспоминал… так что полной уверенности нету.
То есть если результаты ложатся на гауссиану? Но ведь она асимптотически приближается к оси x? k12th, 9 февраля в 14:00
0
klen #
Не очень понял, как это связано. Обычно mock-объекты эмулируют интерфейс к БД, или еще какие-то удаленные сущности, разве нет? k12th, 9 февраля в 13:44
+2
xappymah #
Если это псевдорандомная функция, то при ее вызове должен использоваться некоторый seed.
Переиспользовав полученное псевдорандомное значение в качестве seed'а, вы получаете следующее значение.
Если эта функция написана правильно, то должно гарантироваться, что цепочка значений замкнется только после обхода по всей области значений (на самом деле тоже сомнительное удовольствие это проверять, если область значений большая).

В вашем примере функция же принимает только верхнюю границу области значений, но не seed, что, по факту, делает эту функцию совершенно случайной (она зависит от какой-то другой случайной функции, возможно даже псевдо-случайной, но мы ее не можем контроллировать). Тогда тестировать ее бессмыссленно (для любого поставленного критерия на значения есть ненулевая вероятность, что эти критерии не будут выполнены). Возможно стоит ее изменить, чтобы контроллировать seed?
Я вас понял, спасибо. Нет, в моем случае не получится. Но за информацию спасибо. k12th, 9 февраля в 14:12
+2
KY3EH #
Зависит от задачи, стоящей перед юнит тестированием.
Если задача оценить «случайность» алгоритма и если не требуется автоматизировать этот процесс, то может помочь следующее:
На плоскость выводится точка, координаты которой берутся из двух вызовов функции генерации случайного числа. То есть:
X=rand
Y=rand
DrawPoint( X, Y )
Если в результате будут какие либо закономерности в распределении точек, то «случайность» алгоритма «хромает»
PS:
Помнится в прошлом веке, такой тест функции RND из BASIC приводил к рисованию практически прямой линии, с небольшими выбросами.
А вот и статья KY3EH, 9 февраля в 14:30
Спасибо. k12th, 9 февраля в 14:33
0
Litiy #
Сгенерировать число 1 млн раз, проверить, аппроксимируется ли количество попаданий в небольшие диапазоны до кривой вашего распределения (смотря какое распределение вам нужно, я так понимаю что либо равномерное, либо нормальное).

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