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?
Sie haben einen Tippfehler in Ihrem Code. Das '=' in 'Rand 0 100 = 50 'sollte' == 'sein. – dkasak
Gehst du jemals in den Rng? –
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. –