Das Standard System.Random hat eine reine Oberfläche . Ich würde empfehlen, es in ein State g
einzufügen (für welchen Generator g Sie auch verwenden), um das Einfädeln des Status zu vermeiden; die state
Funktion macht das Drehen von Funktionen wie next
in stateful Aktionen einfach:
Das Paket MonadRandom basiert auf der Schnittstelle State g
mit vordefinierten Wrappern für die Generatorfunktionen; Ich denke, es ist ziemlich populär.
Beachten Sie, dass Sie weiterhin Aktionen mit dieser reinen Benutzeroberfläche ausführen können auf dem globalen RNG . MonadRandom hat zu diesem Zweck evalRandIO .
Ich denke, Sie könnten eine (Waise) schreiben RandomGen Instanz, um mwc-random mit diesen zu verwenden.
Ich mag das mersenne-random-pure64 -Paket. Zum Beispiel können Sie es so verwenden, um einen unendlichen Lazy-Stream von zufälligen Doubles aus einem Seed-Wert zu generieren:
%Vor%mit System.Random (randoms)
Sie können eine ähnliche Ausgabe mit der integrierten Funktion randoms
erhalten, die kürzer und allgemeiner ist (Danke an ehird, dass Sie darauf hingewiesen haben):
macht es zu einer Instanz von MonadRandom
Nachdem ich über MonadRandom
gelesen habe, bin ich neugierig geworden, wie man PureMT
als eine Instanz davon benutzt. Out-of-the-Box funktioniert nicht, weil PureMT
nicht RandomGen
s split
function instanziiert. Eine Möglichkeit, dies zu erreichen, besteht darin, PureMT
in eine newtype
zu schreiben und eine benutzerdefinierte split
-Instanz für die RandomGen
-Klasse zu schreiben, für die eine standardmäßige MonadRandom
-Instanz existiert.
Ein besonders schönes Paket mit einem reinen Interface, das auch für kryptographische Anwendungen geeignet ist und dennoch eine hohe Performance beibehält, ist das cprng- aes Paket.
Es stellt zwei Schnittstellen zur Verfügung: Eine deterministisch reine, die die Typklassen von System.Random verwendet, sowie eine starke IO-Schnittstelle, die die Typklassen aus dem Crypto-API-Paket verwendet.
Als Randnotiz: Ich würde generell die mersenne-random-Pakete gegenüber mwc-random bevorzugen. Sie verwenden den ursprünglichen Mersenne Twister-Algorithmus und haben in meinen Benchmarks einen um ein Vielfaches höheren mwc-Random erreicht.