Haskell QuickCheck Генерация уникальных случайных чисел - PullRequest
4 голосов
/ 26 июля 2011

Кто-нибудь знает точно, как определить генератор в Haskell, используя QuickCheck, чтобы выбранные элементы выбирались только ОДИН РАЗ?

Я дошел до того, что понял, что мне может понадобиться генератор "Gen (Возможно, Positive)", но, конечно, он будет генерировать число с повторением. Я хочу, чтобы выбранные номера выбирались без повторений. В случае, когда возвращается номер, я хочу, чтобы Just вернули, и в случае, когда все случайности исчерпаны, я хочу, чтобы Gen Nothing вернул.

Спасибо

Mark

Ответы [ 3 ]

5 голосов
/ 26 июля 2011

Вы не можете.Посмотрите на определение Gen.Там нет никакого способа, чтобы нести какое-либо состояние о том, что было выбрано до сих пор.Учитывая один и тот же генератор случайных чисел и ограничение размера, он всегда должен генерировать один и тот же результат.Вы можете , однако написать Eq a => Gen [a], который генерирует список значений без повторений.Простой (но несколько наивный) был бы примерно таким.

uniques :: Eq a => Gen a -> Gen [a]
uniques gen = fmap nub $ listOf gen
3 голосов
/ 23 сентября 2011

QuickCheck обычно предназначен для рандомизированного тестирования, а не для исчерпывающего тестирования. Есть несколько замечательных библиотек, которые делают для исчерпывающего тестирования - посмотрите smallcheck и lazysmallcheck .

0 голосов
/ 22 сентября 2011

Для этого вы можете использовать permutations (в модуле Data.List).

Вот сигнатура функции для permutations:

permutations :: [a] -> [[a]]

Как видите, он возвращает список списков.Вот небольшой пример (с использованием GHCi 7.0.4):

> permutations [1..3]<br> [[1,2,3],[2,1,3],[3,2,1],[2,3,1],[3,1,2],[1,3,2]]

Таким образом, вы можете сделать что-то вроде:

prop_unique_elements = forAll (elements (permutations [1..3])) $ \x -> foo == bar

Я не проверял это, поэтому нужно немного помассировать, но я надеюсь, что это ясно говорит об этом.Удачи.

...