Haskell:随机数

Xie*_*Xie 2 haskell

我写了一个函数来随机从[-10,10]得到一对.

import System.Random


main = 
    do { 
         s <- randomNumber
       ; b <- randomNumber
       ; print (head s,head b)}
randomNumber :: IO [Int]
randomNumber = sequence $ replicate 1 $ randomRIO (-10,10)
Run Code Online (Sandbox Code Playgroud)

现在我想要一个像[(1,2),(2,3),(2,3)]这样的列表,所有数字都来自randomNumber.我怎样才能做到这一点?我不知道如何实现这一目标.

我试图使用状态来随机,但不知怎的,我不能在我的计算机上使用状态.我这样做了:

import System.Random
import Control.Monad.State
randomSt :: (RandomGen g, Random a) => State g a
randomSt = State random
Run Code Online (Sandbox Code Playgroud)

但是当我编译它时,它显示:不在范围内:数据构造函数'State'

Dan*_*zer 5

所以如果你想要的只是一个功能

  randomPairs :: IO [(Int, Int)]
Run Code Online (Sandbox Code Playgroud)

然后我们可以做类似的事情

   randomList :: IO [Int]
   randomList = randomRs (-10, 10) `fmap` newStdGen
   randomPairs = ??? randomList randomList
Run Code Online (Sandbox Code Playgroud)

其中???有两个IO [Int]与"拉链"在一起,形成一个IO [(Int, Int)].我们现在转向hoogle并查询函数[a] -> [a] -> [(a, a]),我们发现一个函数,zip :: [a] -> [b] -> [(a, b)]我们现在只需要"升级" zip到IOmonad中以便在IO列表中使用它,所以我们最终得到了

  randomPairs = liftM2 zip randomList randomList
Run Code Online (Sandbox Code Playgroud)

或者如果我们想要真正的幻想,我们可以使用应用程序而最终得到

  import Control.Applicative

  randomPairs = zip <$> randomList <*> randomList
Run Code Online (Sandbox Code Playgroud)

但是从你的判断randomNumber功能可按,你真的只是想一个对.这个想法很相似.相反,生成一个列表,我们产生只有一个随机数randomRIO (-10, 10)和电梯(,) :: a -> b -> (a, b)造成

  randomPair = (,) <$> randomRIO (-10, 10) <*> randomRIO (-10, 10)
Run Code Online (Sandbox Code Playgroud)

最后,State数据构造走前一阵子因为MTL从具有独立的移动State和StateT类型,以使State一个类型同义词.现在你需要使用小写字母state :: (s -> (s, a)) -> State s a

澄清一下,我的最终代码是

import System.Random
import Control.Monad

randomList :: IO [Int]
randomList = randomRs (-10, 10) `fmap` newStdGen

pairs :: IO [(Int, Int)]
pairs = liftM2 zip randomList randomList

somePairs n = take n `fmap` pairs

main = somePairs 10 >>= print
Run Code Online (Sandbox Code Playgroud)