पायथन मानक पुस्तकालय के यादृच्छिक मॉड्यूल में फ़ंक्शन पसंद (), नमूना (), और विकल्प () का उपयोग सूची, टपल, स्ट्रिंग, या अन्य अनुक्रम ऑब्जेक्ट (रैंडम सैंपलिंग) से तत्वों को यादृच्छिक रूप से चुनने और पुनर्प्राप्त करने के लिए किया जा सकता है।
पसंद () को एक तत्व मिलता है, नमूना () और विकल्प () को कई तत्वों की सूची मिलती है। नमूना () गैर-वसूली योग्य निष्कर्षण है जिसमें कोई डुप्लिकेट नहीं है, विकल्प () डुप्लिकेट के साथ पुनर्प्राप्ति योग्य निष्कर्षण है।
निम्नलिखित जानकारी यहाँ प्रदान की गई है।
- यादृच्छिक रूप से एक तत्व का चयन करें।:
random.choice()
- बेतरतीब ढंग से कई तत्वों का चयन करें (कोई डुप्लिकेट नहीं):
random.sample()
- यादृच्छिक रूप से एकाधिक तत्वों का चयन करें (डुप्लिकेट के साथ):
random.choices()
- यादृच्छिक संख्या बीज को ठीक करें
यादृच्छिक रूप से एक तत्व का चयन करें।:random.choice()
यादृच्छिक मॉड्यूल के फ़ंक्शन चयन () के साथ, एक तत्व को सूची से यादृच्छिक रूप से चुना जाता है और इसे पुनर्प्राप्त किया जा सकता है।
import random
l = [0, 1, 2, 3, 4]
print(random.choice(l))
# 1
वही टुपल्स और स्ट्रिंग्स पर लागू होता है। स्ट्रिंग्स के मामले में, एक एकल वर्ण का चयन किया जाता है।
print(random.choice(('xxx', 'yyy', 'zzz')))
# yyy
print(random.choice('abcde'))
# b
त्रुटि अगर एक खाली सूची, टपल, या स्ट्रिंग को एक तर्क के रूप में निर्दिष्ट किया गया है।
# print(random.choice([]))
# IndexError: Cannot choose from an empty sequence
बेतरतीब ढंग से कई तत्वों का चयन करें (कोई डुप्लिकेट नहीं):random.sample()
यादृच्छिक मॉड्यूल के फ़ंक्शन नमूना () के साथ, आप एक सूची से यादृच्छिक रूप से कई तत्व प्राप्त कर सकते हैं। तत्वों का कोई दोहराव नहीं है (गैर-वसूली योग्य निष्कर्षण)।
पहला तर्क एक सूची है, और दूसरा तर्क पुनर्प्राप्त किए जाने वाले तत्वों की संख्या है। सूची वापस कर दी गई है।
import random
l = [0, 1, 2, 3, 4]
print(random.sample(l, 3))
# [2, 4, 0]
print(type(random.sample(l, 3)))
# <class 'list'>
यदि दूसरा तर्क 1 पर सेट है, तो एक तत्व वाली सूची भी लौटा दी जाती है; यदि यह 0 पर सेट है, तो सूची खाली है। यदि दूसरा तर्क 1 है, तो एक तत्व वाली सूची लौटा दी जाती है; यदि यह 0 है, तो एक खाली सूची लौटा दी जाती है; यदि पहला तर्क सूची में तत्वों की संख्या से अधिक है, तो एक त्रुटि उत्पन्न होती है।
print(random.sample(l, 1))
# [3]
print(random.sample(l, 0))
# []
# print(random.sample(l, 10))
# ValueError: Sample larger than population or is negative
यदि पहला तर्क एक टपल या एक स्ट्रिंग है, तो जो लौटाया जाता है वह अभी भी एक सूची है।
print(random.sample(('xxx', 'yyy', 'zzz'), 2))
# ['xxx', 'yyy']
print(random.sample('abcde', 2))
# ['b', 'e']
यदि आप टपल या स्ट्रिंग पर वापस जाना चाहते हैं, तो टपल (), जॉइन () का उपयोग करें।
print(tuple(random.sample(('xxx', 'yyy', 'zzz'), 2)))
# ('xxx', 'yyy')
print(''.join(random.sample('abcde', 2)))
# dc
ध्यान दें कि मान का आकलन नहीं किया जाता है, इसलिए यदि मूल सूची या टपल में समान मान वाले तत्व होते हैं, तो संभावना है कि समान मान का चयन किया जाएगा।
l_dup = [0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3]
print(random.sample(l_dup, 3))
# [3, 1, 1]
यदि आप डुप्लिकेट मानों से बचना चाहते हैं, तो आप इसे एक सेट (सेट प्रकार) में बदलने के लिए सेट () का उपयोग कर सकते हैं और केवल अद्वितीय तत्वों को निकाल सकते हैं, और फिर नमूना () का उपयोग कर सकते हैं।
print(set(l_dup))
# {0, 1, 2, 3}
print(random.sample(set(l_dup), 3))
# [1, 3, 2]
यादृच्छिक रूप से एकाधिक तत्वों का चयन करें (डुप्लिकेट के साथ):random.choices()
यादृच्छिक मॉड्यूल के फ़ंक्शन विकल्प () आपको एक सूची से यादृच्छिक रूप से कई तत्वों को पुनः प्राप्त करने की अनुमति देता है, और नमूना () के विपरीत, यह डुप्लिकेट तत्वों को चुनने की अनुमति देता है।
विकल्प () पायथन 3.6 में जोड़ा गया एक फ़ंक्शन है। यह पुराने संस्करणों में उपलब्ध नहीं है।
तर्क k पुनर्प्राप्त किए जाने वाले तत्वों की संख्या निर्दिष्ट करता है। दोहराव की अनुमति है, इसलिए पुनर्प्राप्त किए जाने वाले तत्वों की संख्या मूल सूची में तत्वों की संख्या से बड़ी हो सकती है।
चूँकि k केवल-कीवर्ड तर्क है, इसलिए एक कीवर्ड निर्दिष्ट करना आवश्यक है, जैसे k=3।
import random
l = [0, 1, 2, 3, 4]
print(random.choices(l, k=3))
# [2, 1, 0]
print(random.choices(l, k=10))
# [3, 4, 1, 4, 4, 2, 0, 4, 2, 0]
k का डिफ़ॉल्ट मान 1 है; यदि इसे छोड़ दिया जाता है, तो 1 तत्व वाली एक सूची वापस कर दी जाती है।
print(random.choices(l))
# [1]
तर्क वजन का उपयोग वजन (संभावना) को निर्दिष्ट करने के लिए किया जा सकता है कि प्रत्येक तत्व का चयन किया जाएगा, और सूची में तत्वों का प्रकार int या float हो सकता है।
print(random.choices(l, k=3, weights=[1, 1, 1, 10, 1]))
# [0, 2, 3]
print(random.choices(l, k=3, weights=[1, 1, 0, 0, 0]))
# [0, 1, 1]
तर्क cum_weights को संचयी भार के रूप में भी निर्दिष्ट किया जा सकता है। निम्नलिखित नमूना कोड में कम_वेट उपरोक्त पहले भार के बराबर है।
print(random.choices(l, k=3, cum_weights=[1, 2, 3, 13, 14]))
# [3, 2, 3]
वज़न और कम_वेट दोनों तर्कों के लिए डिफ़ॉल्ट कोई नहीं है, जिसका अर्थ है कि प्रत्येक तत्व को समान संभावना के साथ चुना गया है।
यदि तर्क की लंबाई (तत्वों की संख्या) weights या cum_weights मूल सूची से अलग है, एक त्रुटि उत्पन्न होती है।
# print(random.choices(l, k=3, weights=[1, 1, 1, 10, 1, 1, 1]))
# ValueError: The number of weights does not match the population_
एक ही समय में वज़न और कम_वेट निर्दिष्ट करना भी एक त्रुटि है।
# print(random.choices(l, k=3, weights=[1, 1, 1, 10, 1], cum_weights=[1, 2, 3, 13, 14]))
# TypeError: Cannot specify both weights and cumulative weights
हमने अब तक नमूना कोड में एक उदाहरण के रूप में पहले तर्क के रूप में एक सूची निर्दिष्ट की है, लेकिन यह टुपल्स और स्ट्रिंग्स पर भी लागू होता है।
यादृच्छिक संख्या बीज को ठीक करें
रैंडम मॉड्यूल के फंक्शन सीड () को एक मनमाना पूर्णांक देकर, रैंडम नंबर सीड को तय किया जा सकता है और रैंडम नंबर जनरेटर को इनिशियलाइज़ किया जा सकता है।
एक ही बीज के साथ आरंभीकरण के बाद, तत्वों को हमेशा उसी तरह चुना जाता है।
random.seed(0)
print(random.choice(l))
# 3
random.seed(0)
print(random.choice(l))
# 3