मैं इस्तेमाल किया उस उद्देश्य के लिए SipHash
import Data.ByteArray.Hash
import Data.ByteString (pack, cons)
import Data.Word (Word8, Word64)
random :: Word64 -> Word64 -> [Word8] -> Double
random a b cs = (subtract 1) . (/(2**63)) . read . drop 8 . show $ sipHash (SipKey a b) (pack cs)
पढ़ने और ड्रॉप 8 और दिखाने के एक newtype जो ऐसा नहीं करता ड्रॉप करने उद्देश्य पूरा (या जब मैं इस से लागू नहीं किया था) किसी भी कास्टिंग का समर्थन
+०१२३५१६४१०६१
अब आप एक श्रेणी में एक इंट चाहते हैं। पूर्णांक हालांकि आसान है:
random :: Word64 -> Word64 -> [Word8] -> (Integer, Integer) -> Integer
random a b cs (low,high) = let
span = high-low
rand = read . drop 8 . show $ sipHash (SipKey a b) (pack cs)
in (rand `mod` span) + low
निश्चित रूप से
, आप अभी भी हर बार एक ही तर्क के लिए एक ही नंबर मिल जाएगा, तो आप अलग-अलग करने के लिए उन्हें यानी आप अभी भी बहुत बहस के आसपास पारित, बस नहीं लौटे मूल्यों की आवश्यकता होगी । कि क्या और अधिक सुविधाजनक की तुलना में एक इकाई निर्भर करता है (मेरी इस प्रयोजन के लिए यह किया गया था)
यह कैसे मुझे यकीन है कि तर्क (विशेष रूप से [Word8] तर्क) हमेशा अलग हो गयी है:
foo bytes = doSomethingRandom bytes
bar bytes = map (\i -> foo (i:bytes)) [1..n]
baz bytes = doSomething (foo (0:bytes)) (bar (1:bytes))
स्रोत
2017-02-11 10:49:03
http: // stackoverflow .com/a/2738824/570689 - इसी तरह के प्रश्न –
के लिए अच्छा जवाब यह लगता है कि आप 'यादृच्छिक Int lo hi = lo' या उस तरह का कुछ है। किसी प्रकार के बीज या आईओ के बिना समारोह को हर बार एक ही मूल्य वापस करना पड़ता है। और निचली बाउंड किसी अन्य 'Int' के रूप में यादृच्छिक है। :) – augustss
"कोई भी जो यादृच्छिक अंकों के उत्पादन के अंकगणितीय तरीकों को मानता है, निश्चित रूप से, पाप की स्थिति में है।" जॉन वॉन न्यूमैन _in_ Knuth, डी। _The Art of Computer Programming_, वॉल्यूम 2, पी। 1 (1 9 81)। – rickythesk8r