【问题标题】:Quickcheck card generator快速检查卡生成器
【发布时间】:2018-08-16 22:55:42
【问题描述】:

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

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%收集)。

【问题讨论】:

    标签: haskell quickcheck


    【解决方案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)
        ]
    

    【讨论】:

    • 尽管我与 haskell 合作了大约 10 年,但像这样的“小”事物、简单的组合和组合以最少的工作量制作复杂的解决方案,让我每天都欣赏这种语言。
    猜你喜欢
    • 2019-05-04
    • 1970-01-01
    • 1970-01-01
    • 2010-11-28
    • 2012-11-19
    • 2018-08-26
    • 2014-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多