2016-10-29 2 views
0

Ich möchte in meinem Spiel zu einem zufälligen Zeitpunkt einen Gegner spawnen. Um dies zu tun, wollte ich jeden Rahmen überprüfen, ob ein Zufallswert [0..100] == 50Haskell Zufallszahlengenerator

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 

(hier rndGen :: stdGen und Feinde :: [Feind])

Aber rand scheint nie 50 zurückzukehren. Was mache ich hier falsch?

+0

Sie haben einen Tippfehler in Ihrem Code. Das '=' in 'Rand 0 100 = 50 'sollte' == 'sein. – dkasak

+1

Gehst du jemals in den Rng? –

+1

Ein zufälliges Float zwischen 0 und 100 wird fast nie genau 50 sein. Wenn du eine Chance von 1% willst, kannst du stattdessen nach 'r <= 1' suchen. Außerdem wirfst du den neuen Generator weg, so dass deine Rand-Funktion immer den gleichen Wert zurückgibt. –

Antwort

0

Die Wahrscheinlichkeit, einen zufälligen Float auf 50 zu bekommen, ist ziemlich niedrig, da Floats nicht unbedingt ganze Zahlen sind. Versuchen Sie zunächst, Ihre Zufallszahl unter Verwendung von floor in ein Integral zu konvertieren.