Quickcheck генератор карт
Итак, я взломал это:
prop = forAll genCards $ \cards -> collect (go cards == True) $ isFlush cards == go cards
go cards = (length . nub . map (\w -> last w)) cards == 1
genCard :: Gen String
genCard = elements[ "1C", "2C", "3C", "4C", "5C", "6C", "7C", "9C", "KC", "QC", "JC", "1H", "2H", "3H", "4H", "5H", "6H", "7H", "9H", "KH", "QH", "JH", "1S", "2S", "3S", "4S", "5S", "6S", "7S", "9S", "KS", "QS", "JS", "1D", "2D", "3D", "4D", "5D", "6D", "7D", "9D", "KD", "QD", "JD"]
genCards :: Gen [String]
genCards = do
replicateM 5 genCard
Однако должен быть лучший способ, но я не мог придумать, как объединить генератор для чисел + один для мастей и способ обеспечить генерирование большего количества сбросов (это ~0,4% по случайной случайности в зависимости от сбора),
1 ответ
Решение
Чтобы сгенерировать карту:
genVal = elements "123456789JQK"
genSuit = elements "CHSD"
genCard = do
val <- genVal
suit <- genSuit
return [val, suit]
Чтобы создать флеш:
genFlush = do
vals <- replicateM 5 genVal
suit <- genSuit
return [[val, suit] | val <- vals]
мой genFlush
как твой genCards
, не гарантирует, что сгенерированные таким образом карты различны. Вы можете выбрать данную вероятность для флеша против обычной руки с frequency
; например, для 60% промывок:
genHandThatIsProbablyAFlush = frequency
[ (3, genFlush)
, (2, genCards)
]