,하지만 난 더 완전한 대답은 매우 간단하게 얻을 프로그래머를 명령형하는 것이 만들 수있는 방법으로, 하스켈에서 임의의 숫자를 사용하는 방법을 보여 것이라고 생각 예를 들면 다음과 같습니다이다. newRand
유형 IO Int
이며하지 Int
import System.Random
newRand = randomIO :: IO Int
때문에,이 함수의 매개 변수로 사용할 수 없습니다
첫째, 당신은 임의의 씨앗이 필요합니다. (이것은 똑같은 결과를 항상 같은 입력으로 반환하는 순수 함수로서 Haskell 함수를 보존합니다.) 그러나 GHCI에 newRand
을 입력하고 매번 고유 한 무작위 배정을 얻을 수 있습니다. 이는 newRand
이 IO
유형이고 표준 (변경 불가능한) 변수 또는 함수가 아니기 때문에 가능합니다.
*Main> newRand
-958036805781772734
그런 다음이 시드 값을 복사하여 우리를위한 난수 목록을 만드는 함수에 붙여 넣을 수 있습니다.우리는 다음과 같은 기능을 정의하는 경우 : 주어진 씨앗에
randomList :: Int -> [Double]
randomList seed = randoms (mkStdGen seed) :: [Double]
를 붙여 넣기 기능은 GHCI에서 실행될 때 : 우리는 1 (전용) 0에서 익숙한 값을 얼마나
*Main> take 10 randomList (-958036805781772734)
[0.3173710114340238,0.9038063995872138,0.26811089937893495,0.2091390866782773,0.6351036926797997,0.7343088946561198,0.7964520135357062,0.7536521528870826,0.4695927477527754,0.2940288797844678]
알 수 있습니다. 우리는 명령형 언어와 같이 반복 할 때마다 새로운 난수를 생성하는 대신 사전에 난수 목록을 생성하고 각각의 연속 재귀에 대해 목록의 꼬리 부분을 사용합니다. 예 :
pythagCheck :: [Double] -> [Double] -> [Int]
pythagCheck (x:xs) (y:ys)
| (a^2) + (b^2) == (c^2) = [a, b, c]
| otherwise = pythagCheck xs ys
where aplusb = ceiling (x * 666)
a = ceiling (y * (fromIntegral (aplusb - 1)))
b = aplusb - a
c = 1000 - a - b
는 미리 두 목록을 작성하고 매개 변수로의 공급은 검색 할 수있게 해준다 트리플 피타고라스의 경우 A + B + C = 1000 당신 것, 물론 (유일한!) 각각의 목록에 대해 다른 임의의 시드를 사용하고 싶습니다.
*Main> newRand
3869386208656114178
*Main> newRand
-5497233178519884041
*Main> list1 = randomList 3869386208656114178
*Main> list2 = randomList (-5497233178519884041)
*Main> pythagCheck list1 list2
[200,375,425]
난수가 불규칙하기 때문에 'IO'모나드 내에 래핑됩니다. 지금까지 무엇을 시도 했습니까? 우리에게 약간의 코드를 보여주십시오. –
이 페이지의 하단에 간단한 간단한 예가 있습니다. http://hackage.haskell.org/package/MonadRandom-0.1.12/docs/Control-Monad-Random.html – mhwombat
Numeric.GSL.Distribution : https : /를 사용하십시오. /hackage.haskell.org/package/hmatrix-gsl-stats –