在Haskell中列出随机数

时间:2015-06-09 18:48:09

标签: list haskell random

我想在Haskell中生成一个包含随机数的列表。我必须使用import System.Random库。我开始做类似的事情,但它不起作用。我必须创建一个包含N个位置的列表,并且所有这些位置必须具有随机数。谢谢!

System.Random library
import System.IO

x = randomRIO (1,6::Int) 

test :: IO Int
test = randomRIO (1,6::Int)

3 个答案:

答案 0 :(得分:11)

您需要运行win32security n次。为此,您可以使用randomRIO。这将为您提供一个monadic值列表,您可以使用replicate转换为monadic值列表:

sequence

答案 1 :(得分:7)

虽然JP Moresmau解决方案当然更受欢迎,但您可能会对更透明的解决方案感兴趣,该解决方案使用doIO表示法和递归函数有所了解:

import System.Random (randomRIO)

randomList :: Int -> IO([Int])
randomList 0 = return []
randomList n = do
  r  <- randomRIO (1,6)
  rs <- randomList (n-1)
  return (r:rs) 

你应该注意以下几点:

  • 如果n == 0该函数将使用return将空列表包装到IO并返回此
  • do机构内的其他内容,它将首先使用r
  • 生成一个随机数randomRIO
  • 接下来,它将使用n-1以递归方式生成随机数的randomList (n-1)元素列表,并将其绑定到rs
  • 最后再次使用returnr:rsn元素列表)包装到IO并返回

这是 GHCi

中的一个示例
λ> randomList 10
[2,4,4,5,2,2,2,5,6,2]

λ> randomList 10
[2,4,4,2,5,2,6,3,4,1]

似乎随机

辞/锻炼:

该功能有n的某些值的问题 - 可以发现它吗?如果是这样 - 您可以将功能更改为 total 吗?

有一些乐趣

如果你仔细观察,你会发现你可以像这样在randomRIO (1,6) :: IO Int拉出来:

mList :: Int -> IO a -> IO([a])
mList 0 gen = return []
mList n gen = do
  r  <- gen
  rs <- mList(n-1) gen
  return (r:rs) 

当然你必须这样使用:

λ> mList 10 $ randomRIO (1,6)
[2,2,2,5,5,1,3,6,6,1]

现在这已经完成了(以稍微不同/更好)的方式,您可以在Control.Monad中找到它replicateM - 使用此导入功能可以简化为:

import System.Random (randomRIO)
import Control.Monad (replicateM)

randomList :: Int -> IO([Int])
randomList n = replicateM n $ randomRIO (1,6)

有趣的事实 internally这与JP回答的完全一致;)

答案 2 :(得分:0)

仅使用一个生成器和无限列表

import Data.List
import System.Random

randomList :: (Int, Int) -> IO [Int]
randomList interval =
  newStdGen >>= return . unfoldr (Just . randomR interval)

main :: IO ()
main = do
  ls <- randomList (1, 6)
  putStrLn $ show $ take 4 ls