gpt4 book ai didi

haskell - System.Random 表现得很奇怪;显示的数字不是被操作的数字

转载 作者:行者123 更新时间:2023-12-01 23:00:28 24 4
gpt4 key购买 nike

我需要生成一些随机数用于测试目的。我以前从未使用过 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]

这毫无意义,我什至不知道从哪里开始尝试修复它。

最佳答案

在您的程序中,您显式生成了 Int 类型的值。 ,在以下几行:

where a = randomRs (1::Int, 10^k-1) ga 
b = randomRs (1::Int, 10^k-1) gb

如果您使用的是 32 位机器,那么生成的数字的乘法可能会导致溢出。例如:
> 6193574 * 9385226 :: Int
4353660

但是,文字本身是重载的。因此,如果您将它们粘贴到 GHCi 中,那么它们将默认为(无界) Integer类型,它们不会溢出:
> 6193574 * 9385226 :: Integer
58128091737724

这解释了应用谓词的困难结果。

所以要么生成 Integer而不是 Int , 或添加类型注释,说明您传递的列表是 [Int]而不是 [Integer]使结果匹配。

关于haskell - System.Random 表现得很奇怪;显示的数字不是被操作的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16860636/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com