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)
虽然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使用randomRIOn-1使用randomList (n-1)并将其绑定到递归生成随机数的元素列表rsreturn再次使用包装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)
现在这已经做过(略有不同/更好)的方式,你可以找到它replicateM的Control.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回答的完全相同;)
| 归档时间: |
|
| 查看次数: |
5380 次 |
| 最近记录: |