2016-04-20 7 views
2

Hier habe ich eine Funktion einen Strom von Zufallszahlen zwischen 0 und 999.Haskell Zufallszahl mit einem Anstand ohne explizite Rekursion

randomHelp :: RandomGen g => g -> [Int] 
randomHelp g = zipWith (mod) (map fst $ iterate (next . snd) $ next $ snd $ split g) $ repeat 1000 

Ich mag alle Nummern wählen aus dem Stream oben definiert würde zu erzeugen und jeder elem(i) und elem(i + 1) muss eine Anständigkeit respektieren. Zum Beispiel muss ihr gcd eins sein. Alles, was ich denken kann, ist eine Faltfunktion mit, weil ich mit einem Akkumulator beginnen kann, der die Zahl 1 enthält (angenommen, 1 ist das erste Element, das ich zeigen möchte), dann überprüfe ich die Korrektheit in der Funktion von falten und wenn es respektiert wird, füge ich hinzu das Element zum Akkumulator, aber das Problem sind die Programmblöcke wegen Stackoverflow, denke ich. Hier

ist die Funktion:

randomFunc :: RandomGen g => g -> [Int] 
randomFunc g = foldl (\acc x -> if (gcd x (last acc) == 1) then acC++ [x] else acc) [1] (randomHelp g) 

Anmerkung: Ich möchte nicht explizite Rekursion verwenden.

Antwort

2

Eine richtige Falte passen würde wahrscheinlich besser, so etwas wie:

import System.Random (RandomGen, randomRs, mkStdGen) 

randomFunc :: RandomGen g => g -> [Int] 
randomFunc g = foldr go (const []) (randomRs (1, 20) g) 1 
    where go x f lst = if gcd x lst == 1 then x: f x else f lst 

dann

\> take 20 . randomFunc $ mkStdGen 1 
[16,7,6,19,8,15,16,1,9,2,15,17,14,3,11,17,15,8,1,5] 

Andernfalls können Sie die Liste erstellen mit : statt ++ die quadratisch Leistungskosten verursachen, und Sie können den Anruf zu last umgehen.

+0

Ich verstehe nicht wirklich, wie das funktioniert? Kannst du mir erklären? – zaig

+0

@zaig dies ist eine Anwendung von 'foldr :: Faltbare t => (a -> b -> b) -> b -> ta -> b' wo' b' selbst ist eine Funktion, wie 'c -> d ', so würde die Signatur sein: (a -> (c -> d) -> c -> d) -> (c -> d) -> ta -> c -> d '. wenn du folgst sollte die signatur sinnvoll sein wie es funktioniert –

+0

ich verstehe immer noch nicht wer die funktion f ist? Bei der Reihenfolge würde ich sagen, dass es "randomRs" ist, wenn go aufgerufen wird, aber "randomRs" braucht einen Generator und "lst" und "x" sind keine Generatoren. Ich bin immer noch ein wenig verwirrt. Was vermisse ich? – zaig