首页 > 解决方案 > 如何在haskell中创建一个随机列表

问题描述

我是haskell的新手,遇到了这个问题:正如标题所说,我正在尝试使用随机数创建一个给定长度的列表,范围在一些x和y之间。例如,如果 x=0 且 y=10,则列表将类似于:[0,4,3,8,0,2]。我宁愿用列表理解来做,没有任何 IO。我看过一些关于类似主题的帖子,但到目前为止没有一个对我有帮助。

标签: listhaskellrandomlist-comprehension

解决方案


System.Random在包中使用random,这正是功能randomRs

randomRs :: (Random a, RandomGen g) => (a, a) -> g -> [a]

它需要一个值范围和一个生成器,并返回该范围内的随机值的惰性列表。您可以使用以下方法从固定种子制作生成器mkStdGen

mkStdGen :: Int -> StdGen

例如,这是一个种子(在我的机器上,使用我的特定版本random)巧合地产生您提供的示例值:

> take 6 $ randomRs (0, 10) $ mkStdGen 15915
[0,4,3,8,0,2]

如果您希望程序在每次调用时产生不同的随机值,则必须使用 IO 为随机数生成器播种当前时间。为此,您可以newStdGen改用:

newStdGen :: IO StdGen

一个完整的例子:

import System.Random (newStdGen, randomRs)

main :: IO ()
main = do
  gen <- newStdGen
  print $ randomList 6 0 10 gen

randomList
  :: (Random a, RandomGen g)
  => Int -> a -> a -> g -> [a]
randomList len lo hi gen = take len $ randomRs (lo, hi) gen

推荐阅读