k12th
@k12th
console.log(`You're pulling my leg, right?`);

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

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


Теорию вероятностей я помню очень плохо, но, кажется, даже m вызовов такой функции (при m заведомо большем, чем n) не смогут ничего гарантировать.
  • Вопрос задан
  • 3152 просмотра
Решения вопроса 1
bagyr
@bagyr
en.wikipedia.org/wiki/Diehard_tests

Доказать математически что-то на реальных цифрах не выйдет.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 5
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Если у нас выйдет нормальное распределение случайной величины — поидее это гуд. Но я так же давно теорвер не вспоминал… так что полной уверенности нету.
Ответ написан
xappymah
@xappymah
Если это псевдорандомная функция, то при ее вызове должен использоваться некоторый seed.
Переиспользовав полученное псевдорандомное значение в качестве seed'а, вы получаете следующее значение.
Если эта функция написана правильно, то должно гарантироваться, что цепочка значений замкнется только после обхода по всей области значений (на самом деле тоже сомнительное удовольствие это проверять, если область значений большая).

В вашем примере функция же принимает только верхнюю границу области значений, но не seed, что, по факту, делает эту функцию совершенно случайной (она зависит от какой-то другой случайной функции, возможно даже псевдо-случайной, но мы ее не можем контроллировать). Тогда тестировать ее бессмыссленно (для любого поставленного критерия на значения есть ненулевая вероятность, что эти критерии не будут выполнены). Возможно стоит ее изменить, чтобы контроллировать seed?
Ответ написан
Зависит от задачи, стоящей перед юнит тестированием.
Если задача оценить «случайность» алгоритма и если не требуется автоматизировать этот процесс, то может помочь следующее:
На плоскость выводится точка, координаты которой берутся из двух вызовов функции генерации случайного числа. То есть:
X=rand
Y=rand
DrawPoint( X, Y )
Если в результате будут какие либо закономерности в распределении точек, то «случайность» алгоритма «хромает»
PS:
Помнится в прошлом веке, такой тест функции RND из BASIC приводил к рисованию практически прямой линии, с небольшими выбросами.
Ответ написан
Litiy
@Litiy
Сгенерировать число 1 млн раз, проверить, аппроксимируется ли количество попаданий в небольшие диапазоны до кривой вашего распределения (смотря какое распределение вам нужно, я так понимаю что либо равномерное, либо нормальное).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы