生成随机元组Haskell

时间:2012-12-02 13:39:49

标签: haskell random tuples

我想知道是否可以使用以下代码生成随机元组:

take 4 $ randomRs ((0,0),(70,100)) $ mkStdGen x  :: [(Double,Double)]

当我尝试这个时,我得到错误:

No instance for (Random (Float, Float)) arising from a use of 'randoms'

有没有办法在不使用zip的情况下获取随机元组?

2 个答案:

答案 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))