在Haskell中列出随机数

Thi*_*ues 2 random haskell list

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

System.Random library
import System.IO

x = randomRIO (1,6::Int) 

test :: IO Int
test = randomRIO (1,6::Int)
Run Code Online (Sandbox Code Playgroud)

JP *_*mau 12

你需要运行randomRIOn次.为此您可以使用replicate.这将为您提供一个monadic值列表,您可以将其转换为monadic值列表sequence:

test :: Int -> IO [Int]
test n = sequence $ replicate n $ randomRIO (1,6::Int)
Run Code Online (Sandbox Code Playgroud)


Car*_*ten 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) 
Run Code Online (Sandbox Code Playgroud)

你应该注意以下几点:

  • 如果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]
Run Code Online (Sandbox Code Playgroud)

似乎随机

备注/运动:

该功能存在某些值的问题n- 你能发现它吗?如果是这样的话 - 你可以将功能改为总数吗?

有一些乐趣

如果你仔细观察,你会发现你可以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) 
Run Code Online (Sandbox Code Playgroud)

当然你必须使用这样的:

?> mList 10 $ randomRIO (1,6)
[2,2,2,5,5,1,3,6,6,1]
Run Code Online (Sandbox Code Playgroud)

现在这已经做过(略有不同/更好)的方式,你可以找到它replicateMControl.Monad-与此导入功能简化为:

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

randomList :: Int -> IO([Int])
randomList n = replicateM n $ randomRIO (1,6)
Run Code Online (Sandbox Code Playgroud)

内部有趣的事实,这与JP回答的完全相同;)