Haskell et de nombres aléatoires
Je me suis amusé avec Haskell quelques jours et je suis tombé sur un problème.
J'ai besoin d'une méthode qui retourne une liste aléatoire d'entiers ( Rand [[Int]] ).
Donc, j'ai défini un type: type Rand a = StdGen -> (a, StdGen)
.
J'ai été en mesure de produire Rand IO Integer
et Rand [IO Integer]
( (returnR lst) :: StdGen -> ([IO Integer], StdGen)
) en quelque sorte. Toutes les astuces pour produire Rand [[Int]]
?
OriginalL'auteur Indrek | 2010-04-29
Vous devez vous connecter pour publier un commentaire.
Comment éviter le
IO
dépend pourquoi il est introduit dans la première place. Alors que les pseudo-générateurs de nombres aléatoires sont par nature étatique, il n'y a pas de raisonIO
doit être impliqué.Je vais faire une supposition et dire que vous êtes à l'aide de
newStdGen
ougetStdGen
pour obtenir votre initiale PRNG. Si c'est le cas, alors il n'y a aucun moyen d'échapper complètement àIO
. Vous pouvez déclencher le PRNG directement avecmkStdGen
, en gardant à l'esprit que même les semences de suite dans la même "aléatoire" nombre de la séquence.Plus probablement, ce que vous voulez faire est d'obtenir un GÉNÉRATEUR à l'intérieur de
IO
, puis passer que comme un argument à une fonction pure. La chose entière sera toujours enveloppé dansIO
à la fin, bien sûr, mais les calculs intermédiaires ne pas en avoir besoin. Voici un exemple rapide pour vous donner l'idée:Vous remarquerez que le code en utilisant le GÉNÉRATEUR est assez laid due au passage de la valeur actuelle et en arrière en permanence. C'est aussi potentiellement sujettes à erreur, car il serait facile pour accidentellement réutiliser une ancienne valeur. Comme mentionné ci-dessus, en utilisant le même GÉNÉRATEUR de valeur que va donner la même séquence de nombres, ce qui n'est généralement pas ce que vous voulez. Les deux problèmes sont un parfait exemple de l'endroit où il est logique d'utiliser un
State
monade, qui est prise en hors sujet ici, mais vous aimeriez peut-être la prochaine.OriginalL'auteur C. A. McCann
Vous recréer MonadRandom sur Hackage. Si ce est plus que juste une expérience pour voir si vous pouvez le faire, vous pouvez utiliser la bibliothèque la place.
OriginalL'auteur luqui
Si vous voulez obtenir un infini liste de
Integer
s vous allez courir dans des problèmes que vous ne jamais obtenir uneStdGen
valeur de retour. Ce que vous voulez faire ici estsplit
laStdGen
tout d'abord, passer la moitié de nouveau et "utiliser" l'autre moitié pour générer une liste infinie d'entiers. Quelque chose comme ceci:Toutefois, si vous répétez cette approche pour obtenir une matrice infinie de
Integer
s (à laquelle vous semblez vous le souhaitez, en utilisantRand [[Int]]
), vous pourriez rencontrer des problèmes de nature statistique: je ne sais pas comment bienStdGen
traite répétéesplit
ting. Peut-être une autre mise en œuvre deRandomGen
peut-être mieux, ou vous pouvez essayer d'utiliser une sorte de diagonale à pied à son tour un[Int]
dans un[[Int]]
.OriginalL'auteur yatima2975
À l'aide de monadique de notation, vous devez être capable d'écrire quelque chose comme
Et avec cette
Concernant la monadique les calculs lui-même, jetez un oeil à cet article. Notez que les générateurs aléatoires sont pures, vous ne devriez pas besoin de tout
IO
juste pour ce but.OriginalL'auteur Dario