テスト目的で乱数を生成する必要がありました。以前に Data.Random を使用したことがありません。多くのテストを行う必要があり、事前に必要な数値の量はわかりませんでしたが、それらが特定の境界に収まる必要があることはわかっていました。私は関数を書きました:
import System.Random
f k = (\(x,y) -> x*y < (10^k) && x*y >0 )
rands n g k = take n $ filter (\(x,y) -> x*y < (10^k) && x*y >0 ) (zip a b)
where a = randomRs (1::Int, 10^k-1) ga
b = randomRs (1::Int, 10^k-1) gb
(ga, gb) = split $ mkStdGen g
生成された数値を使用して物事をテストし始めました。この関数を使用すると、奇妙なことに気付き始めました。
testRands n k = do
g1 <- randomIO
g2 <- randomIO
let r = rands n (mkStdGen g1, mkStdGen g2) k
putStrLn $ show r
putStrLn $ show $ map (\(x,y) -> x*y < 10^k && x*y >0) r
putStrLn $ show $ map (\(x,y) -> x*y) r
putStrLn $ show $ maximum $ map (\(x,y) -> x*y) r
*Main> testRands 4 7
[(6193574,9385226),(9634973,5475375),(5070277,7408626),(3801396,5652588)]
[True,True,True,True]
[4353660,6993107,2038586,4030960]
6993107
次に、生成された数値をコピーして GHCI に貼り付け、それらすべてに対してまったく同じ述語関数を呼び出します。
*Main> map (f 7) [(6193574,9385226),(9634973,5475375),(5070277,7408626),(3801396,5652588)]
[False,False,False,False]
これは意味がなく、どこから修正しようとしているのかさえわかりません。