2016-10-29 7 views
0

私は自分のゲームでランダムな時間に敵を産みたい。 はこれを行うには、私は、各フレームをチェックしたい場合は、ランダムな値[0..100] ==ハスケル乱数発生器

spawnEnemy :: World -> World 
spawnEnemy ([email protected] { rndGen = r, enemies = e }) = world { enemies = if rand 0 100 == 50 then Enemy (rand (-200) 200, rand (-200) 200) 0 0 : e else e } 
    where 
     rand :: Float -> Float -> Float 
     rand l h = fst $ randomR (l, h) r 

50(ここではrndGen :: stdGenと敵:: [敵])

しかしランド012を返すようです。 私はここで何が間違っていますか?

+0

コードに誤字があります。 'rand 0 100 = 50'の' = 'は '=='でなければなりません。 – dkasak

+1

あなたは今までにrngを踏んでいますか? –

+1

0と100の間のランダムな浮動小数点数は、決して正確に50になることはほとんどありません。もしあなたが1%の確率を望むならば、代わりに 'r <= 1'をチェックするかもしれません。また、rand関数が常に同じ値を返すように、新しいジェネレータを破棄します。 –

答えて

0

浮動小数点数が必ずしも整数ではないため、ランダム浮動小数点数が50になる確率はかなり低くなります。 floorを使用して乱数を最初にIntegralに変換してみてください。