4

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

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

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

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

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

4

2 回答 2

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在元组上使用(前提是元组中的类型支持随机生成)。

于 2012-12-02T13:59:43.473 回答
3

您可以使用 state 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))
于 2012-12-02T13:56:56.033 回答