8
votes

Pure Pseudo-aléatoire générateurs pour Haskell avec une API agréable?

Quels sont les packages Haskell recommandés pour les générateurs pseudo-aléatoires pure (doubles uniformes)?

Je suis intéressé par une API commode en premier lieu, la vitesse serait bien aussi.

Peut-être mwc-aléatoire?


0 commentaires

3 Réponses :


5
votes

la standard System.random a une interface pure. Je recommanderais de l'embellir dans un état g (pour n'importe quel générateur g que vous utilisez) pour éviter de enfiler l'état; état fonctionne des fonctions de tournage comme suivant dans les actions stipuleuses faciles: xxx

le monadrandom est basé sur l'interface état g avec des emballages pré-écrits pour les fonctions génératrices; Je pense que c'est assez populaire.

Notez que vous pouvez toujours exécuter des actions en utilisant cette interface pure sur le Global RNG . Monadrandom a Evalrandio à cet effet.

Je pense que vous pouvez écrire un (orphelin) aléatoire instance pour utiliser mwc-aléatoire avec ceux-ci.


4 commentaires

@ehird qu'est-ce que la source de randomneur libre IO de l'IO qui le garderait pure? Ecc?


@JFRITSCH: N'oubliez pas que Pure ne signifie pas seulement pas io. Une fonction pure doit toujours renvoyer le même résultat compte tenu des mêmes arguments. La seule "source de randomness" est le générateur ou graines ( g dans les signatures de type).


@JFRITSCH: Aucun PRNG ne consulte une source externe pour chaque numéro; Vous venez d'obtenir la graine de là. Vous pouvez créer des valeurs de type stdgen (une instance de randomgen ) à partir d'une graine, et il y a un générateur global à IO grimpa d'une source externe.


@hehird pour P Rngs Vous avez certainement raison. Sinon, "Non" est un peu fort: d sqrtech.com . Un bon aléatoire est un problème dans un monde Web2.0 et IO joue un rôle important.



8
votes

J'aime le Mersenne-aléatoire-pure64 package. Par exemple, vous pouvez l'utiliser comme ceci pour générer un flux paresseux infini de doubles aléatoires à partir d'une valeur de graine: xxx pré>

à l'aide du système.random (Randoms) Strong> P >

Vous pouvez obtenir une sortie similaire avec la fonction intégrée randoms code>, qui est plus courte et plus générale (merci à EHIRD pour pointer que sortant): P>

import Control.Monad.Random
import System.Random.Mersenne.Pure64

getTenRandomDoubles :: Rand MyPureMT [Double]
getTenRandomDoubles = getRandoms >>= return . take 10

main = print $ evalRand getTenRandomDoubles g
  where g = MyPureMT $ pureMT 42


newtype MyPureMT = MyPureMT { unMyPureMT :: PureMT }
myPureMT = MyPureMT . pureMT

instance RandomGen MyPureMT where
  next  = nextMyPureMT
  split = splitMyPureMT

splitMyPureMT :: MyPureMT -> (MyPureMT, MyPureMT)
splitMyPureMT (MyPureMT g) = (myPureMT s, myPureMT s') where
  (s',g'') = randomWord64 g'
  (s ,g' ) = randomWord64 g

nextMyPureMT (MyPureMT g) = (s, MyPureMT g') where
  (s, g') = randomInt g


4 commentaires

Vous pouvez le faire pour tout randomgen (de lequel puremt est une instance), avec Randoms :: (Randomgen g, A) => G -> [ a] .


@hehird Oh, je ne savais pas sur Randoms ! Mise à jour de ma réponse


Il y a aussi monad-mersenne-aléatoire Hackage.hakell.org / Package / Monad-Mersenne-aléatoire intégré sur Mersenne-aléatoire-pure64 . Il possède une belle propriété qui permet de courir l'itération monadique dans un espace mémoire constant (voir cette question: Stackoverflow.com/questions/3236442).


@sastanin merci de me diriger vers la question connexe et monad-mersenne-aléatoire , m'a donné de nouvelles perspectives!



2
votes

Un paquet particulièrement agréable avec une interface pure qui convient également aux applications cryptographiques et maintient une performance élevée est le CPRNG-AES paquet.

Il fournit deux interfaces: une pure déterministe à l'aide des classes de type de System.Random ainsi qu'une interface IO forte à l'aide des classes de type du package Crypto-API.

comme une note latérale: je préférerais généralement les paquets de mersenne-aléatoires sur mwc-aléatoire. Ils utilisent l'algorithme Twister Mersenne original et dans mes repères surperformé MWC-aléatoire par un facteur important.


0 commentaires