我需要生成一些随机数用于测试目的。我以前从未使用过 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]
这毫无意义,我什至不知道从哪里开始尝试修复它。