我正在使用Test.QuickCheck生成隨機數獨謎題。Test.QuickCheck不能正確生成隨機值
data Sudoku = Sudoku { getSudoku :: [[Maybe Int]] } deriving (Show, Eq)
rows :: Sudoku -> [[Maybe Int]]
rows (Sudoku rs) = rs
--B1
printSudoku :: Sudoku -> IO()
printSudoku s = do
putStrLn . unlines . map (map (maybe '.' (head . show))) $ rows s
--C1
cell :: Gen (Maybe Int)
cell = suchThatMaybe (frequency [(90, choose (0,0)),(10, choose(1,9))]) (/=0)
--C2
instance Arbitrary Sudoku where
arbitrary = do
rows <- sequence [ sequence [ cell | j <- [1..9] ] | i <- [1..9] ]
return (Sudoku rows)
--C3
prop_Sudoku :: Sudoku -> Bool
prop_Sudoku = isSudoku
checkRandomSudoku :: IO [Bool]
checkRandomSudoku = do
s <- sample' (arbitrary :: Gen Sudoku)
return $ map isSudoku s
該代碼運行良好。然而,當我執行
一個< - 樣本」(任意::創數獨)
序列$地圖printSudoku一個
返回是這樣的:
....5..3.
...4.....
...2.....
...5.....
.........
...33....
...5.....
...2.4...
.........
.........
.343.....
.........
......9.2
.........
45....5.1
.2......7
.7..88.34
.9....6..
....2..8.
.2121638.
.7.7...9.
4..45.6..
.....6.2.
..6.6....
53..9.6..
..9....7.
.47892...
.373411..
5...3282.
...45..9.
8989..18.
31.8113..
9..35.6..
4.685....
.4....39.
7..6.5.76
48.178.53
1.871.4.4
3165.17..
.1...7.59
.98126.51
6.6...775
9.4636952
.5..239..
372.....8
.34.73129
.5.8.27.1
344.34931
28.6.94.1
6327.3..8
3743.5496
93...7984
..82.8...
..3.54.93
273847853
5568.7465
832.73515
3766..6.7
.7.196256
1.96.9.3.
.7156.268
1615.196.
.392..633
731652284
863.8.768
31..5.5.6
961.5.467
1245.1159
5..275471
52.727759
6.656.849
99.72352.
這顯然是根本不是隨機的。空細胞的分佈開始時非常高,然後緩慢下降。我是否使用了錯誤的功能或以錯誤的方式使用?謝謝
作爲你的做法評論(而不是你目前的問題的說明):我覺得這不是一個好主意。生成正確的數獨謎題似乎是其中一種聽起來很容易但不是的東西,我敢打賭,一旦解決了這個問題,你會遇到十幾個奇怪的問題。但在野外已經有很多拼圖 - 你可以通過使用現有的語料庫來跳過所有的問題嗎? –
我只是繼續[在此](http://www.cse.chalmers.se/edu/year/2013/course/TDA555/lab3.html)發現的練習。我有點同意你的看法。在我的例子中,你可以看到它甚至沒有檢查行/列/框中是否有重複的數字,但我仍然想知道爲什麼它不會像我期望的那樣生成隨機數。特別是頻率,我會期待更多空缺項目,因爲我擁有更多的權重比編號條目 – dtan