2011-11-02 4 views
1

J'essaie de générer 10 nombres aléatoires dans Haskell mkStdGen dans la gamme de 0 (inclus) à 100 (exclusif).générateur de nombres aléatoires dans Haskell

quelque chose d'équivalent du code Java suivant

Random ran = new Random(); 
ran.nextInt(100); 

Note, je dois utiliser mkStdGen

C'est ce que j'ai jusqu'à présent
rand low high seed = fst (randomR (low, high) (mkStdGen seed))
randomlist :: Int -> Int -> Int -> [Int]
randomlist l h num = take num (map (rand l h) [0..])

+2

Est-ce ce devoir? Pouvez-vous nous montrer quel code vous avez jusqu'ici? –

+0

prochain (mkStdGen 3) est ce que j'ai jusqu'ici, je suis toujours en train de lire la documentation. Mais avoir un extrait de code spécifique qui ferait ran.nextInt (100) rendrait les choses beaucoup plus faciles à comprendre. – nobody

+0

... la plupart des documents haskell n'aiment pas donner d'exemple concret – nobody

Répondre

6
import System.Random 

tenPseudorandomNumbers :: Int -> [Int] 
tenPseudorandomNumbers seed = take 10 . randomRs (0, 99) . mkStdGen $ seed 

Notez que ce n » t vraiment pseudo-aléatoire, car mkStdGen prend une graine explicite. newStdGen serait mieux, si vous êtes autorisé à courir dans IO.

+1

Eh bien, ce n'est pas vraiment aléatoire, en tout cas, c'est toujours un PRNG. Si vous acquérez la graine de la même façon que les langues impures (par exemple en lisant '/ dev/urand', de ce que Java fait par défaut), ceci est aussi pseudo-aléatoire que l'exemple de Java. – delnan

+0

True; Je vais éditer pour dire que ce n'est même pas vraiment pseudo-aléatoire. – dave4420

+3

Je suggère de refactoring comme 'pseudoRandoms :: StdGen -> Int -> [Int]', en passant le générateur et lié comme arguments, alors vous pouvez obtenir le générateur de quelque manière que ce soit disponible, 'mkStdGen' ou' newStdGen' et utiliser d'une manière pure, même si elle venait de IO. S'attaquer à un 'take k' à la fin peut être laissé à l'utilisateur sans problèmes. –

Questions connexes