快速检查卡生成器

Quickcheck card generator

好的,所以我破解了这个:

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%根据收集的机会)。

生成卡片:

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 一样,不保证以这种方式生成的卡片是不同的。您可以 select 给定的同花概率与普通手牌的概率 frequency;例如60% 同花顺:

genHandThatIsProbablyAFlush = frequency
    [ (3, genFlush)
    , (2, genCards)
    ]