Тестирование на случайное значение - мысли об этом подходе? - PullRequest
8 голосов
/ 23 сентября 2008

ОК, я работал со случайным селектором изображений и системой очередей (поэтому вы не видите одни и те же изображения слишком часто).

Все шло гладко (насколько мой дерьмовый код) до Я дошел до случайного бита. Я хотел это проверить, но как ты это делаешь? Нет Debug.Assert(i.IsRandom) (к сожалению): D

Итак, после того, как я полил его чаем, у меня возникли мысли, и мне пришло в голову следующее: мне было просто интересно, могу ли я подумать?

  • По сути, я знал, что проблема была в бите random , поэтому я разорвал его делегату (который затем был бы передан конструктору объектов).
  • Затем я создал класс, который в значительной степени выполняет ту же логику, что и код live , но запоминает значение, выбранное в закрытой переменной.
  • Затем я бросил этого делегата в живой класс и проверил:
* * Тысяча двадцать-одиной т.е.
Debug.Assert(myObj.RndVal == RndIntTester.ValuePassed);

Но я не мог не подумать, я тратил впустую свое время? Я провел это через множество итераций, чтобы посмотреть, не упало ли оно в любое время и т. Д.

Как вы думаете, я тратил свое время на это? Или я мог бы сойти с рук:

Awesome Random Number Generator

Ответ GateKiller напомнил мне об этом:

Dilbert Random

Обновление до уточнения

  • Я должен добавить, что в принципе я никогда не хочу видеть один и тот же результат более X раз из пула размера Y.
  • Добавление тестового контейнера в основном позволило мне увидеть, было ли какое-либо из ранее выбранных изображений «случайно» выбрано.
  • Технически, я думаю, здесь тестируется не ГСЧ (поскольку я никогда не писал этот код), а тот факт, что я ожидаю случайных результатов от ограниченного пула, и я хочу их отслеживать.

Ответы [ 19 ]

0 голосов
/ 23 сентября 2008

Хотя вы не можете проверить случайность, вы можете проверить ее на корреляцию или распределение последовательности чисел.

Трудно проверить цель: каждый раз, когда нам нужно изображение, выбирайте случайным образом 1 из 4 изображений.

Легко проверить цель: для каждых 100 выбранных изображений каждое из 4 изображений должно появляться не менее 20 раз.

0 голосов
/ 23 сентября 2008

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

На практике вызывайте функцию много раз и проверяйте результаты. Если вы ожидаете иметь N изображений, рассчитайте 100 * N случайных чисел, а затем посчитайте, сколько из каждого ожидаемого числа было найдено. Большинство должно появиться 70-130 раз. Повторите тест с другим случайным начальным числом, чтобы увидеть, отличаются ли результаты.

Если вы обнаружите, что генератор, который вы используете сейчас, недостаточно хорош, вы можете легко что-то найти. Google для «Mersenne Twister» - это гораздо более случайный, чем вам когда-либо нужно.

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

0 голосов
/ 23 сентября 2008

Не проверяйте случайность, проверьте, желательны ли ваши результаты (или, скорее, попробуйте получить нежелательные результаты несколько раз, прежде чем признать, что ваши результаты, вероятно, будут желательными). Будет невозможно гарантировать, что вы никогда не получите нежелательный результат, если тестируете случайный вывод, но вы можете по крайней мере увеличить шансы, что вы заметите, что это происходит.

Я бы либо взял N пулов размера Y, проверяя любые результаты, которые появляются более чем X раз, либо взял бы один пул размера N * Y, проверяя каждую группу размера Y на любой результат, который появляется больше X раз (от 1 до Y, от 2 до Y + 1, от 3 до Y + 2 и т.д.). Значение N зависит от того, насколько надежным будет тест.

0 голосов
/ 23 сентября 2008

Чтобы получить серию неповторяющихся случайных чисел:

  1. Создать список случайных чисел.
  2. Добавить порядковый номер к каждому случайному числу
  3. Сортировать упорядоченный список по оригинальному случайному числу
  4. Используйте ваш порядковый номер в качестве нового случайного числа.
0 голосов
/ 23 сентября 2008

Мое мнение таково, что что-либо случайное не может быть должным образом проверено.

Конечно, вы можете попытаться проверить его, но есть так много комбинаций, чтобы попытаться, что вам лучше просто полагаться на ГСЧ и выборочную проверку большого количества случаев.

0 голосов
/ 23 сентября 2008

Ну, проблема в том, что случайные числа по определению могут повторяться (потому что они ... ждут этого: случайные). Возможно, вы хотите сохранить последнее случайное число и сравнить его с вычисленным, и, если оно равно, просто вычислить другое ... но теперь ваши числа меньше случайных (я знаю, что такого не бывает как «более или менее» случайность, но позвольте мне использовать термин только в этот раз), потому что они гарантированно не повторятся.

В любом случае, вы никогда не должны так много думать о случайных числах. :)

0 голосов
/ 23 сентября 2008

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

0 голосов
/ 23 сентября 2008

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

0 голосов
/ 23 сентября 2008

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

...