पायथन में numpy.random और random.random के बीच अंतर


100

मेरे पास पायथन में एक बड़ी स्क्रिप्ट है। मैंने खुद को अन्य लोगों के कोड में प्रेरित किया इसलिए मैंने numpy.randomकुछ चीजों के लिए मॉड्यूल का उपयोग करना समाप्त कर लिया (उदाहरण के लिए एक द्विपद वितरण से लिए गए यादृच्छिक संख्याओं की एक सरणी बनाने के लिए) और अन्य स्थानों में मैं मॉड्यूल का उपयोग करता हूं random.random

क्या कोई मुझे दोनों के बीच के प्रमुख अंतर बता सकता है? दो में से प्रत्येक के लिए डॉक्टर के वेबपेज को देखकर मुझे यह लगता है कि numpy.randomअभी और भी तरीके हैं, लेकिन मैं इस बारे में स्पष्ट नहीं हूं कि यादृच्छिक संख्याओं की पीढ़ी अलग कैसे है।

मैं क्यों पूछ रहा हूं इसका कारण यह है कि मुझे डिबगिंग उद्देश्यों के लिए अपने मुख्य कार्यक्रम को बीजने की आवश्यकता है। लेकिन यह तब तक काम नहीं करता है जब तक कि मैं सभी मॉड्यूलों में समान यादृच्छिक संख्या जनरेटर का उपयोग नहीं करता हूं जो मैं आयात कर रहा हूं, क्या यह सही है?

इसके अलावा, मैं यहां एक और पोस्ट में पढ़ता हूं, उपयोग नहीं करने के बारे में एक चर्चा numpy.random.seed(), लेकिन मैं वास्तव में यह नहीं समझ पाया कि यह इतना बुरा विचार क्यों था। मैं वास्तव में सराहना करूंगा अगर कोई मुझे समझाए कि ऐसा क्यों है।

जवाबों:


120

आपने पहले ही कई सही अवलोकन किए हैं!

जब तक आप दोनों रैंडम जेनरेटर्स को सीड करना चाहते हैं, तब तक संभवत: एक जनरेटर या दूसरे को चुनना लंबे समय में सरल होगा। लेकिन अगर आपको दोनों का उपयोग करने की आवश्यकता है, तो हाँ, आपको उन दोनों को भी बीजने की आवश्यकता होगी, क्योंकि वे एक दूसरे से स्वतंत्र रूप से यादृच्छिक संख्या उत्पन्न करते हैं।

के लिए numpy.random.seed(), मुख्य कठिनाई यह है कि यह थ्रेड-सुरक्षित नहीं है - अर्थात, यदि आपके पास निष्पादन के कई अलग-अलग धागे हैं , तो इसका उपयोग करना सुरक्षित नहीं है , क्योंकि यह काम करने की गारंटी नहीं है यदि दो अलग-अलग थ्रेड्स एक ही समय में फ़ंक्शन निष्पादित कर रहे हैं। यदि आप थ्रेड्स का उपयोग नहीं कर रहे हैं, और यदि आप यथोचित अपेक्षा कर सकते हैं कि आपको भविष्य में इस तरह से अपने कार्यक्रम को फिर से लिखने की आवश्यकता नहीं है, तो आपको numpy.random.seed()ठीक होना चाहिए। यदि आपको संदेह करने का कोई कारण है कि आपको भविष्य में थ्रेड्स की आवश्यकता हो सकती है, तो यह लंबे समय तक सुझाव के रूप में करने के लिए सुरक्षित है, और कक्षा का स्थानीय उदाहरण बनाने के लिएnumpy.random.Random । जहां तक ​​मैं बता सकता हूं, random.random.seed()थ्रेड-सेफ है (या कम से कम, मुझे इसके विपरीत कोई सबूत नहीं मिला है)।

numpy.randomपुस्तकालय आमतौर पर वैज्ञानिक अनुसंधान में इस्तेमाल कुछ अतिरिक्त संभाव्यता वितरण, साथ ही यादृच्छिक डेटा की सरणियों पैदा करने के लिए सुविधा कार्यों के एक जोड़े हैं। random.randomपुस्तकालय थोड़ा और हल्के है, और ठीक हो सकता है अगर आप वैज्ञानिक अनुसंधान या आँकड़ों में काम के अन्य प्रकार नहीं कर रहे हैं।

अन्यथा, वे दोनों अपने यादृच्छिक संख्याओं को उत्पन्न करने के लिए मेरसेन ट्विस्टर अनुक्रम का उपयोग करते हैं, और वे दोनों पूरी तरह से निर्धारक हैं - अर्थात, यदि आप जानकारी के कुछ प्रमुख बिट्स जानते हैं, तो यह निश्चित रूप से पूर्ण निश्चितता के साथ भविष्यवाणी करना संभव है कि आगे क्या नंबर आएगा । इस कारण से, कोई गंभीर क्रिप्टोग्राफ़िक उपयोगों के लिए न तो numpy.random और न ही random.random उपयुक्त है । लेकिन क्योंकि यह क्रम बहुत लंबा है, दोनों ही उन मामलों में यादृच्छिक संख्या उत्पन्न करने के लिए ठीक हैं, जहां आप अपने डेटा को रिवर्स-इंजीनियर करने की कोशिश कर रहे लोगों के बारे में चिंतित नहीं हैं। यादृच्छिक मूल्य को वरीयता देने का यह भी कारण है - यदि आप हर बार एक ही स्थान पर शुरू करते हैं, तो आपको हमेशा यादृच्छिक संख्याओं का क्रम मिलेगा!

एक तरफ ध्यान दें, यदि आप करते क्रिप्टोग्राफिक स्तर अनियमितता की जरूरत है, आप का उपयोग करना चाहिए रहस्य मॉड्यूल, या की तरह कुछ Crypto.Random यदि आप एक अजगर संस्करण अजगर 3.6 से पहले उपयोग कर रहे हैं।


14
एक दूर से संबंधित नोट के रूप में, यह कभी-कभी न तो उपयोग करने के लिए neccesary है , क्योंकि Mersenne ट्विस्टर क्रिप्टोग्राफिक (और कुछ असामान्य वैज्ञानिक) उद्देश्यों के लिए एन्ट्रापी के यादृच्छिक क्रम का उत्पादन नहीं करता है। उन दुर्लभ मामलों में, आपको अक्सर Crypto.Random की आवश्यकता होती है , जो random.randomअकेले से उपलब्ध उच्च गुणवत्ता के गैर-निर्धारक यादृच्छिक अनुक्रम उत्पन्न करने के लिए ओएस विशिष्ट एन्ट्रापी स्रोतों का उपयोग करने में सक्षम है । आपको आमतौर पर इसकी आवश्यकता नहीं है, हालांकि।
सिंगलएनजेशन इलेक्शन 21

थैंक यू हन्नेले। आपकी अंतर्दृष्टि वास्तव में बहुत उपयोगी थी! यह पता चला है कि मैं केवल एक ही यादृच्छिक संख्या जनरेटर का उपयोग करके दूर नहीं हो सकता, (जो यादृच्छिक होने के बाद से सुन्न होने की आवश्यकता है क्योंकि द्विपद वितरण का उत्पादन नहीं करता है) क्योंकि मेरे कार्यक्रम के कुछ अन्य प्रोग्राम कॉल करते हैं जो यादृच्छिक का उपयोग करता है। मुझे दो जनरेटर लगाने होंगे।
लौरा

2
"यदि आप जानते हैं कि आपके पास अब कौन सी संख्या है, तो यह निश्चित होना संभव है कि आगे क्या संख्या आएगी।" मुझे लगता है कि इस कथन को कुछ स्पष्टीकरण की आवश्यकता हो सकती है। इसका मतलब यह है कि यदि आप जनरेटर की आंतरिक स्थिति को जानते हैं तो आप अनुक्रम को पुन: उत्पन्न कर सकते हैं - जो कि आप जनरेटर को सीड करते समय करते हैं। जनरेटर से एकल संख्या उत्पादन को देखते हुए आप अगले नंबर की भविष्यवाणी नहीं कर सकते। यह अवधि इतनी बड़ी है कि आपको संभवतः संख्याओं के एक लंबे अनुक्रम की आवश्यकता होगी इससे पहले कि आप गणना कर सकें कि आप छद्म यादृच्छिक अनुक्रम पर कहां हैं और इस तरह अगले की भविष्यवाणी करें।
कौशिक घोष

12

डेटा विश्लेषण के लिए पायथन से , मॉड्यूल कई प्रकार के संभाव्यता वितरणों से नमूना मूल्यों के पूरे सरणियों को कुशलतापूर्वक उत्पन्न करने के लिए कार्यों के साथ numpy.randomपायथन randomको पूरक करता है ।

इसके विपरीत, पायथन का अंतर्निहित randomमॉड्यूल एक समय में केवल एक मूल्य का numpy.randomनमूना लेता है , जबकि बहुत बड़ा नमूना तेजी से उत्पन्न कर सकता है। IPython मैजिक फ़ंक्शन का उपयोग करके %timeitकोई भी यह देख सकता है कि कौन सा मॉड्यूल तेज़ी से कार्य करता है:

In [1]: from random import normalvariate
In [2]: N = 1000000

In [3]: %timeit samples = [normalvariate(0, 1) for _ in xrange(N)]
1 loop, best of 3: 963 ms per loop

In [4]: %timeit np.random.normal(size=N)
10 loops, best of 3: 38.5 ms per loop

1
अन्य तरीकों के लिए मामला नहीं है। के np.random.randint(2)साथ तुलना random.randrange(2)और NumPy एक धीमी थी । NumPy: 1.25 हमें और रैंडम: 891 ns। और यह भी के लिए एक ही संबंध np.random.rand()और random.random()
शायन अमानी

3

बीज का स्रोत और वितरण प्रोफ़ाइल का उपयोग आउटपुट को प्रभावित करने वाला है - यदि आप क्रिप्टोग्राफिक यादृच्छिकता की तलाश कर रहे हैं, तो डिवाइस सेटर (यानी ईथरनेट या डिस्क) (यानी / /) से लगभग वास्तविक यादृच्छिक बाइट्स प्राप्त होंगे। बीएसडी पर देव / यादृच्छिक)

यह आपको एक बीज देने से बचाएगा और इसलिए निर्धारक यादृच्छिक संख्याओं को उत्पन्न करेगा। हालाँकि रैंडम कॉल तब आपको संख्याओं को एक वितरण में फिट करने की अनुमति देती है (जिसे मैं वैज्ञानिक रैंडम नेस कहता हूं - आखिरकार आप चाहते हैं कि रैंडम नंबरों का एक घंटी वक्र वितरण हो, इसको पूरा करने में सुन्न सबसे अच्छा है।

तो हाँ, एक जनरेटर के साथ छड़ी, लेकिन तय करें कि आप क्या यादृच्छिक चाहते हैं - यादृच्छिक, लेकिन एक विचलित वक्र से, या यादृच्छिक रूप में आप एक क्वांटम डिवाइस के बिना प्राप्त कर सकते हैं।


बहुत बहुत धन्यवाद पॉल, आपका जवाब वास्तव में उपयोगी था! मैं क्रिप्टोग्राफिक यादृच्छिकता की तलाश नहीं कर रहा हूं, मैं गणितीय मॉडलिंग कर रहा हूं और मेरे लिए छद्म यादृच्छिक संख्या पर्याप्त है। यह पता चला है कि मैं एक जनरेटर से नहीं चिपक सकता क्योंकि मैं चाहता था कि मुझे द्विपद वितरण के लिए सुन्न और मेरे कार्यक्रम को एक और प्रोग्राम कॉल करना है जो यादृच्छिक का उपयोग करता है :(
लौरा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.