gpt4 book ai didi

Haskell:随机数

转载 作者:行者123 更新时间:2023-12-02 04:36:33 27 4
gpt4 key购买 nike

我写了一个函数来从 [-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)

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

我曾尝试使用状态来获得随机数,但不知何故我无法在我的计算机上使用状态。我这样做了:

import System.Random
import Control.Monad.State
randomSt :: (RandomGen g, Random a) => State g a
randomSt = State random

但是我编译的时候显示:Not in scope: data constructor ‘State’

最佳答案

所以如果你想要的只是一个函数

  randomPairs :: IO [(Int, Int)]

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

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

??? 接受两个 IO [Int] 并将它们“压缩”在一起形成一个 IO [(Int, Int)]。我们现在转向 hoogle并查询一个函数 [a] -> [a] -> [(a, a]) 我们找到一个函数 zip::[a] -> [b] -> [(a, b)] 我们现在只需要将 zip“提升”到 IO monad 中,以便在 IO 中使用它> 列表,所以我们最终得到

  randomPairs = liftM2 zip randomList randomList

或者如果我们真的想要花哨的话,我们可以使用应用程序来代替

  import Control.Applicative

randomPairs = zip <$> randomList <*> randomList

但是从您的 randomNumber 函数来看,您真的只想要一对。这个想法非常相似。我们不生成列表,而是使用 randomRIO (-10, 10) 生成一个随机数并提升 (,)::a -> b -> (a, b)导致

  randomPair = (,) <$> randomRIO (-10, 10) <*> randomRIO (-10, 10)

最后,State 数据构造器不久前就消失了,因为 MTL 从拥有单独的 StateStateT 类型转变为制作 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

关于Haskell:随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21866126/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com