Как вы проверяете, что что-то случайное? Или «достаточно случайным»?

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

Я написал функцию, и поскольку я использую random модуль в Python, возможно, если я не использовал его глупо.

Теперь, как я могу написать модульный тест, который проверяет, работает ли эта функция? В конце концов, если это хорошая случайная ценность, вы никогда не узнаете.

Я не параноик, моя функция не такая сложная, и стандартная библиотека Python составляет 1000 х времени, достаточно подходящего для моей цели. Я не занимаюсь криптографией или чем-то критичным. Мне просто интересно узнать, есть ли способ.

5 Solutions collect form web for “Как вы проверяете, что что-то случайное? Или «достаточно случайным»?”

Есть несколько статистических тестов, перечисленных в RANDOM.ORG для проверки случайности . См. Последние два раздела связанной статьи.

Кроме того, если вы можете получить копию « Красивого тестирования» , вы можете прочитать целую главу Джона Д. Кука « Тестирование генератора случайных чисел» . Он объясняет многие статистические методы, перечисленные в статье выше. Если вы действительно хотите узнать о RNG, эта глава является действительно хорошей отправной точкой. Я сам писал об этом предмете, но Джон гораздо лучше объясняет это.

Вы не можете сказать (см. Мультфильм).

Тем не менее, вы можете измерить энтропию вашего сгенерированного образца и протестировать его против энтропии, которую вы ожидаете. Как уже упоминалось ранее, random.org делает некоторые довольно умные тесты.

alt text

У вас может быть, что тестирование устройства вызывает функцию несколько раз и убедитесь, что количество столкновений достаточно низкое. Например, если ваш случайный результат находится в диапазоне 1-1000000, вызовите функцию 100 раз и запишите результаты; затем проверьте, есть ли дубликаты. Если есть (или более одного столкновения, в зависимости от того, насколько вы боитесь ложного теста), тест терпит неудачу. Очевидно, что это не идеально, но поймать его, если вы произвольное число от Дильберта: http://www.random.org/analysis/

У вас две запутанные проблемы. Первая проблема – это проверка того, что ваш случайный выбор работает. При посещении вашего PRNG вы можете написать тест, который является детерминированным и о котором вы можете утверждать. Это должно дать вам уверенность в вашем коде, учитывая, что базовые функции соответствуют их обязанностям (т.е. случайный возвращает вам достаточно хороший поток случайных значений).

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

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

  • Почему can not unittest.TestCases видят мои инструменты py.test?
  • В python есть хорошая идиома для использования контекстных менеджеров в настройке / отрыве
  • Как проверить (используя unittest) вывод HTML представления Django?
  • Как издеваться над объектом курсора psycopg2?
  • Убить насмешливый объект: история Python
  • AssertRaises не подлежит вызову
  • Пакет тестирования Python
  • Как использовать тестовый обработчик сервера торнадо, который аутентифицирует пользователя через безопасный файл cookie
  • Python - лучший язык программирования в мире.