Reine Pseudozufallsgeneratoren für Haskell mit einer netten API?

8

Was sind die empfohlenen Haskell-Pakete für reine Pseudozufallsgeneratoren (uniforme Doubles)?

Ich bin in erster Linie an einer praktischen API interessiert, Geschwindigkeit wäre auch schön.

Vielleicht mwc-zufällig?

    
Yrogirg 08.01.2012, 09:22
quelle

3 Antworten

5

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:

%Vor%

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.

    
ehird 08.01.2012, 09:31
quelle
7

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):

%Vor%

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.

%Vor%     
Thies Heidecke 08.01.2012 12:27
quelle
2

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.

    
ertes 10.01.2012 17:05
quelle

Tags und Links