如何调用这个Haskell函数?

如何调用这个Haskell函数?,haskell,random,Haskell,Random,这是一个生成给定范围内随机数列表的函数,但是我不知道如何调用这个函数。我认为StdGen需要一个seed,但是如果有人能告诉我们如何准确地调用这个函数,我会非常感激 randomList :: (Random a) => (a,a) -> Int -> StdGen -> [a] randomList bnds n = take n . randomRs bnds 样本: main :: IO () main = do g <- getStdGen

这是一个生成给定范围内随机数列表的函数,但是我不知道如何调用这个函数。我认为StdGen需要一个seed,但是如果有人能告诉我们如何准确地调用这个函数,我会非常感激

randomList :: (Random a) => (a,a) -> Int -> StdGen -> [a]
randomList bnds n = take n . randomRs bnds
样本:

main :: IO ()
main = do g <- getStdGen
          print (randomList (1, 100) 5 g :: [Integer])
g是随机数生成器,在本例中是全局随机数生成器。
以下是以元组、多个元素和一个StdGen的形式提供的范围,即随机列表0,10 100 gen,其中gen::StdGen。StdGen仅表示标准随机数生成器,有多种方法可以获得:

,这是一个IO操作,返回全局StdGen。 ,将种子作为Int传递。当然,mkStdGen seed将为同一种子生成相同的随机数;如果您想要确定的结果,这是有用的,但如果您每次都想要不同的随机数,这当然没有帮助: 例如,getStdGen>>=randomList 0,10 100具有类型Random a=>IO[a],并在执行时生成100个从0到10的随机数的列表,例如,通过在do块中执行数字>=randomList 0,10 100

但是,randomList不会返回生成数字后获得的最终StdGen,因此,除非您为每次使用它创建一个新的StdGen,否则它将始终返回相同的结果。我在上面展示的操作在每次运行程序时都会产生不同的结果,但是如果在一次运行程序的过程中在相同的范围内多次使用该操作,则每次都会产生相同的数字

这可以通过手动生成列表而不是使用randomRs来解决;例如:

randomList :: (Random a) => (a,a) -> Int -> StdGen -> ([a], StdGen)
randomList _ 0 gen = ([], gen)
randomList bnds n gen = (x:xs, gen'')
  where
    (x, gen') = randomR bnds gen
    (xs, gen'') = randomList bnds (n-1) gen'
main :: IO ()
main = replicateM_ 10 $ do
    xs <- getStdRandom $ randomList (0,10) 100
    print xs
然后可以使用全局StdGen使用;例如:

randomList :: (Random a) => (a,a) -> Int -> StdGen -> ([a], StdGen)
randomList _ 0 gen = ([], gen)
randomList bnds n gen = (x:xs, gen'')
  where
    (x, gen') = randomR bnds gen
    (xs, gen'') = randomList bnds (n-1) gen'
main :: IO ()
main = replicateM_ 10 $ do
    xs <- getStdRandom $ randomList (0,10) 100
    print xs

这将产生10个不同的列表,每个列表包含100个元素。

切勿使用getStdGen!这是造成某些混乱的原因。要澄清的是,getStdGen的问题是,如果您连续两次这样做,每次都会得到相同的数字。最好使用NewstGen,它将拆分全局生成器,而不是只返回未经修改的生成器。@Rotsor如果在一个程序中只使用一个生成器,getStdGen是否有问题?Daniel,我不知道。这是一个很大的假设。