我想知道是否可以使用以下代码生成随机元组:
take 4 $ randomRs ((0,0),(70,100)) $ mkStdGen x :: [(Double,Double)]
当我尝试这个时,我得到错误:
No instance for (Random (Float, Float)) arising from a use of 'randoms'
有没有办法在不使用zip
的情况下获取随机元组?
答案 0 :(得分:7)
基本上错误信息是说没有定义的方法来制作随机元组。但你当然可以自己添加一个。
离开我的头顶(即我实际上没有测试过这个),你可以做类似
的事情instance (Random x, Random y) => Random (x, y) where
randomR ((x1, y1), (x2, y2)) gen1 =
let (x, gen2) = randomR (x1, x2) gen1
(y, gen3) = randomR (y1, y2) gen2
in ((x, y), gen3)
现在你可以在元组上使用randomR
(假设元组中的类型支持随机生成)。
答案 1 :(得分:3)
您可以使用状态monad方便地生成随机元组:
import Control.Applicative
import Control.Monad.State
import System.Random
randomTupleR ::
(Random a, Random b, RandomGen g)
=> (a, a)
-> (b, b)
-> g
-> ((a, b), g)
randomTupleR xb yb =
runState (liftA2 (,) (state $ randomR xb) (state $ randomR yb))