已经Random有Float. 假设您还有和的Random实例,您可以使用它们来定义 的实例:VectorPointRandomAsteroid
instance Random Asteroid where
randomR (Asteroid pl vl sl, Asteroid ph vh sh) g =
let (p, g1) = randomR (pl, ph) g
(v, g2) = randomR (vl, vh) g1
(s, g3) = randomR (sl, sh) g2
in (Asteroid p v s, g3)
random g =
let (p, g1) = random g
(v, g2) = random g1
(s, g3) = random g2
in (Asteroid p v s, g3)
该randomR函数采用一系列值,从最小值(低)到最大值(高)。你如何定义一个复杂值的有意义的范围Asteroid,我会留给你;在这里,我只是假设您可以传递低值和高Asteroid值。
第一步通过调用使用底层Random实例。是一个随机生成的值,是下一个要使用的随机生成器值。PointrandomRpPointg1
同样,v是一个随机生成的Vector值,由 的基础实例生成Vector。
最后,s是由forFloat生成的。randomRFloat
返回值是Asteroid由 、 和 加上最新的生成器组成p的v新s值g3。
的实现random遵循相同的模板。
您可以用更漂亮的形式编写此代码,例如使用 using MonadRandom,但对于初学者,我将代码保留为原始形式以显示其工作原理。