में सूची से प्रतिस्थापन के बिना यादृच्छिक नमूना लेने का बेहतर तरीका मुझे लंबी सूची से प्रतिस्थापन के बिना यादृच्छिक नमूना लेने की आवश्यकता है (प्रत्येक तत्व केवल नमूना में एक बार होता है)। मैं नीचे दिए गए कोड का उपयोग कर रहा हूं, लेकिन अब मैं जानना चाहता हूं:हास्केल
- क्या कोई लाइब्रेरी फ़ंक्शन है जो यह करता है?
- मैं इस कोड को कैसे सुधार सकता हूं? (मैं एक हास्केल शुरुआती हूं, इसलिए लाइब्रेरी फ़ंक्शन होने पर भी यह उपयोगी होगा)।
नमूनाकरण का उद्देश्य जनसंख्या में नमूना का विश्लेषण करने से निष्कर्षों को सामान्यीकृत करने में सक्षम होना है।
import System.Random
-- | Take a random sample without replacement of size size from a list.
takeRandomSample :: Int -> Int -> [a] -> [a]
takeRandomSample seed size xs
| size < hi = subset xs rs
| otherwise = error "Sample size must be smaller than population."
where
rs = randomSample seed size lo hi
lo = 0
hi = length xs - 1
getOneRandomV g lo hi = randomR (lo, hi) g
rsHelper size lo hi g x acc
| x `notElem` acc && length acc < size = rsHelper size lo hi new_g new_x (x:acc)
| x `elem` acc && length acc < size = rsHelper size lo hi new_g new_x acc
| otherwise = acc
where (new_x, new_g) = getOneRandomV g lo hi
-- | Get a random sample without replacement of size size between lo and hi.
randomSample seed size lo hi = rsHelper size lo hi g x [] where
(x, g) = getOneRandomV (mkStdGen seed) lo hi
subset l = map (l !!)
मैं आपकी आबादी को एक सरणी में लिखने का सुझाव दूंगा, फिर फिशर/येट्स उस सरणी को घुमाएंगे (जहां तक आवश्यक हो)। –
आप एक शफल के पहले 'आकार' तत्व ले सकते हैं, शायद पैकेज [यादृच्छिक-शफल] (http: // हैकेज का उपयोग कर।haskell.org/package/random-shuffle) या सीधे [Data.Random.Extras] का उपयोग करके एक नमूना लें (http://hackage.haskell.org/packages/archive/random-extras/0.19/doc/html/Data- यादृच्छिक-Extras.html) [यादृच्छिक-अतिरिक्त] से (http://hackage.haskell.org/package/random-extras) पैकेज। – AndrewC