2011-11-02 2 views
1

하스켈에서 난수를 생성하려고합니다. mkStdGen 0에서 100까지의 범위에서 생성하려고합니다. 다음 Java 코드하스켈의 난수 생성기

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

참고 해당

뭔가, 나는이 내가 지금까지
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

이 숙제가 있습니까? 지금까지 어떤 코드를 가지고 있는지 보여줄 수 있습니까? –

+0

next (mkStdGen 3)는 제가 지금까지 가지고있는 것입니다. 나는 아직도 문서를 읽고 있습니다. 그러나 ran.nextInt (100)를 사용하면 특정 코드 조각을 가지고 이해하기가 훨씬 쉬워집니다. – nobody

+0

... 대부분의 haskell 문서는 구체적인 예제를주는 것을 좋아하지 않습니다. – nobody

답변

6
import System.Random 

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

참고가 무엇 mkStdGen

를 사용해야하는이 ISN ' mkStdGen이 명시적인 시드를 취하기 때문에 실제로는 의사 난수입니다. IO에 들어갈 수 있다면 newStdGen이 더 좋을 것입니다.

+1

글쎄, 어떤 경우에도 실제로는 무작위가 아닙니다. 항상 PRNG입니다. 불순한 언어와 동일한 방식으로 시드를 획득하면 (예 : Java가 기본값 인'/ dev/urand '에서 읽음) Java 예제와 마찬가지로 의사 랜덤입니다. – delnan

+0

참; 나는 그것이 의사 난수조차도 아니다라고 말하기 위해 편집 할 것이다. – dave4420

+3

'pseudoRandoms :: StdGen -> Int -> [Int]'로 리팩터링을 제안하고, 생성자를 전달하고 인수로 바인딩하면, 사용 가능한 방법으로 생성자를 얻을 수 있습니다. 'mkStdGen' 또는'newStdGen'을 사용하십시오. 그것도 IO에서 온 경우에도 순수한 방식으로. 마지막에'take k '를 붙이는 것은 문제없이 사용자에게 맡길 수 있습니다. –