वहाँ अच्छा जवाब यहाँ हैं, लेकिन मैं एक और अधिक पूरा जवाब बहुत बस हो और हास्केल में यादृच्छिक संख्या का उपयोग करें, एक तरीका है कि कोई मतलब होगा प्रोग्रामर अनिवार्य करने के लिए करने के लिए कैसे पता चलेगा महसूस किया।
import System.Random
newRand = randomIO :: IO Int
क्योंकि newRand
प्रकार IO Int
की है और नहीं Int
, यह एक समारोह पैरामीटर के रूप में नहीं किया जा सकता:
पहले, आप एक यादृच्छिक बीज की जरूरत है। (यह हास्केल कार्यों को शुद्ध कार्यों के रूप में संरक्षित करता है जो हमेशा एक ही इनपुट पर एक ही परिणाम लौटाएंगे।)
हालांकि, हम जीएचसीआई में newRand
दर्ज कर सकते हैं और प्रत्येक बार एक अद्वितीय यादृच्छिक बीज प्राप्त कर सकते हैं। यह केवल इसलिए संभव है क्योंकि newRand
प्रकार IO
है और यह मानक (अपरिवर्तनीय) चर या फ़ंक्शन नहीं है।
*Main> newRand
-958036805781772734
हम तो इसे कॉपी करके एक समारोह है कि हमारे लिए यादृच्छिक संख्या की एक सूची बनाता है में इस बीज मूल्य चिपका सकते हैं।तब हम निम्नलिखित समारोह को परिभाषित:
randomList :: Int -> [Double]
randomList seed = randoms (mkStdGen seed) :: [Double]
और दिए गए बीज में पेस्ट समारोह GHCi में चलाया जाता है जब:
*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]
सूचना कैसे हम 1 (अनन्य) 0 से परिचित मूल्यों को प्राप्त। एक नया यादृच्छिक संख्या उत्पन्न करने के बजाय प्रत्येक पुनरावृत्ति जैसे हम एक अनिवार्य भाषा में करेंगे, हम समय से पहले यादृच्छिक संख्याओं की एक सूची उत्पन्न करते हैं और प्रत्येक क्रमिक पुनरावृत्ति पर सूची की पूंछ के सिर का उपयोग करते हैं। एक उदाहरण:
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
समय से आगे दो सूचियां बनाकर और उन्हें पैरामीटर के रूप में में खिलाने के लिए खोज करने के लिए हमें की अनुमति देता है पायथागॉरियन ट्रिपल जहां एक + बी + सी = 1000 तुम होगा, निश्चित रूप से (एक और केवल!) , प्रत्येक सूची के लिए एक अलग यादृच्छिक बीज का उपयोग करना चाहते हैं:
*Main> newRand
3869386208656114178
*Main> newRand
-5497233178519884041
*Main> list1 = randomList 3869386208656114178
*Main> list2 = randomList (-5497233178519884041)
*Main> pythagCheck list1 list2
[200,375,425]
यादृच्छिक संख्या अशुद्ध हैं, यही कारण है कि वे 'आईओ' मोनैड के भीतर लपेटे गए हैं। आपने अभी तक क्या प्रयास किया है? कृपया हमें कुछ कोड दिखाएं। –
इस पृष्ठ के निचले भाग में एक अच्छा सरल उदाहरण है http://hackage.haskell.org/package/MonadRandom-0.1.12/docs/Control-Monad-Random.html – mhwombat
न्यूमेरिक.जीएसएल का उपयोग करें। वितरण: https://hackage.haskell.org/package/hmatrix-gsl-stats –