Float
の場合、すでにRandom
のインスタンスがあります。 Vector
とPoint
ためRandom
インスタンスを持っているあなたも、あなたがAsteroid
ためRandom
インスタンスを定義するためにそれらを使用することができると仮定すると:
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
値を渡すことができると仮定しています。
最初の手順ではPoint
の基底のRandom
インスタンスを使用して、randomR
を呼び出します。 p
は、ランダムに生成されたPoint
の値であり、g1
は、次に使用するランダムな生成器の値です。
同様に、v
は、ランダムに生成されたVector
という値で、Vector
の下位インスタンスによって生成されます。
最後に、s
は、Float
のrandomR
によって生成されるFloat
です。
戻り値は、新しいAsteroid
p
から成る値、v
、およびs
、プラス最新の発電g3
です。
random
の実装は同じテンプレートに従います。
このコードは、たとえば次のようなよりきれいな形で書くことができます。 MonadRandom
を使用していますが、初心者向けには、コードをそのままの形で残して、その動作を示しています。
[関連](http://hackage.haskell.org/package/QuickCheck-2.10.1/docs/Test-QuickCheck-Arbitrary.html#v:arbitrary)。 –
インスタンスを書き込もうとしましたか?あなたは何の問題を見つけましたか? – chi
[ランダム: System.Random](https://hackage.haskell.org/package/random-1.1/docs/System-Random.html#g:4)を見たことがありますか?あなたの 'Asteroid'データ型のための' Random'インタフェースを実装するあなたの努力を示すことができますか? – epsilonhalbe