我想在Haskell中生成一个包含随机数的列表。我必须使用import System.Random库。我开始做类似的事情,但它不起作用。我必须创建一个包含N个位置的列表,并且所有这些位置必须具有随机数。谢谢!
System.Random library
import System.IO
x = randomRIO (1,6::Int)
test :: IO Int
test = randomRIO (1,6::Int)
答案 0 :(得分:11)
您需要运行win32security
n次。为此,您可以使用randomRIO
。这将为您提供一个monadic值列表,您可以使用replicate
转换为monadic值列表:
sequence
答案 1 :(得分:7)
虽然JP Moresmau解决方案当然更受欢迎,但您可能会对更透明的解决方案感兴趣,该解决方案使用do
对IO
表示法和递归函数有所了解:
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
return
将r:rs
(n
元素列表)包装到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