लगातार एक ही यादृच्छिक संख्या बनाएँ


89

मैं कोड के एक टुकड़े को समाप्त करने के लिए किसी अन्य डेवलपर की प्रतीक्षा कर रहा हूं जो -1,0, या 1 के मूल्यों के साथ आकार (100,2000) की एक एनपी सरणी लौटाएगा।

इस बीच, मैं बेतरतीब ढंग से उन्हीं विशेषताओं की एक सरणी बनाना चाहता हूं ताकि मुझे अपने विकास और परीक्षण पर एक शुरुआत मिल सके। बात यह है कि मैं चाहता हूं कि यह बेतरतीब ढंग से बनाई गई सरणी हर बार समान हो, ताकि मैं एक ऐसे सरणी के खिलाफ परीक्षण नहीं कर रहा हूं जो हर बार जब मैं अपनी प्रक्रिया को फिर से चलाता हूं तो इसका मूल्य बदलता रहता है।

मैं अपनी सरणी इस तरह बना सकता हूं, लेकिन क्या इसे बनाने का कोई तरीका है ताकि यह हर बार समान हो। मैं ऑब्जेक्ट को अचार कर सकता हूं और इसे अनपिक कर सकता हूं, लेकिन सोच रहा हूं कि क्या कोई और तरीका है।

r = np.random.randint(3, size=(100, 2000)) - 1

जवाबों:


84

बस एक निश्चित मूल्य के साथ यादृच्छिक संख्या जनरेटर बीज, जैसे

numpy.random.seed(42)

इस तरह, आपको हमेशा समान यादृच्छिक क्रम प्राप्त होगा।


43
numpy.random.seed()जब मैं ध्यान नहीं दे रहा था तो किसी ने समारोह में झांका । :-) मैंने जानबूझकर इसे मूल मॉड्यूल से बाहर रखा। मेरा सुझाव है कि लोग अपने स्वयं के उदाहरणों का उपयोग करेंRandomState और उन वस्तुओं को चारों ओर से पारित करें।
रॉबर्ट केर्न

6
सुन्न करने में रॉबर्ट का बड़ा योगदान है। मुझे लगता है कि हमें उनकी राय को कुछ वजन देना चाहिए।
पदावनत

10
@deprecated: मैं रॉबर्ट के काम के लिए आभारी हूं, लेकिन सिफारिश के लिए तर्क देने के लिए उनका काम कोई विकल्प नहीं है। इसके अलावा, यदि उपयोग numpy.random.seed()को हतोत्साहित किया जाता है, तो इसे प्रलेखन में उल्लेख किया जाना चाहिए । जाहिर है, NumPy के अन्य योगदानकर्ताओं ने रॉबर्ट की राय साझा नहीं की है। कोई अपराध नहीं है, मैं बस उत्सुक हूँ।
स्वेन मार्नाच

13
यह पायथन मानक पुस्तकालय में random.seedकिसी random.Randomवस्तु का उपयोग बनाम के समान है । यदि आप उपयोग करते हैं random.seedया numpy.random.seed, आप सभी यादृच्छिक उदाहरणों को अपने कोड में और किसी भी कोड में, जिसे आप कॉल कर रहे हैं या किसी भी कोड को, जो आपके जैसे ही सत्र में चलाया जाता है, बीजारोपण कर रहे हैं । यदि वे चीजें उन चीजों पर निर्भर करती हैं जो वास्तव में यादृच्छिक हैं, तो आप समस्याओं में भागना शुरू कर देते हैं। यदि आप यादृच्छिक बीज सेट करने वाले कोड को तैनात करते हैं, तो आप सुरक्षा भेद्यता का परिचय दे सकते हैं।
asmeurer

3
@ सुरक्षाकर्ता सुरक्षा उद्देश्यों के लिए छद्म आयामी संख्या जनरेटर का उपयोग करने वाला कोई भी व्यक्ति शायद यह नहीं जानता कि वे क्या कर रहे हैं।
JAB

191

numpy.random.RandomState()अपने चुने हुए बीज के साथ अपना खुद का उदाहरण बनाएं । numpy.random.seed()अनम्य पुस्तकालयों के आसपास काम करने के अलावा उपयोग न करें जो आपको अपने स्वयं के RandomStateउदाहरण के आसपास से गुजरने न दें ।

[~]
|1> from numpy.random import RandomState

[~]
|2> prng = RandomState(1234567890)

[~]
|3> prng.randint(-1, 2, size=10)
array([ 1,  1, -1,  0,  0, -1,  1,  0, -1, -1])

[~]
|4> prng2 = RandomState(1234567890)

[~]
|5> prng2.randint(-1, 2, size=10)
array([ 1,  1, -1,  0,  0, -1,  1,  0, -1, -1])

7
क्या आपकी सिफारिश के लिए आपके पास कोई औचित्य है? इसमें गलत क्या है numpy.random.seed()? मुझे पता है कि यह थ्रेड-सेफ नहीं है, लेकिन अगर थ्रेड-सेफ्टी की जरूरत नहीं है तो यह वास्तव में सुविधाजनक है।
स्वेन मार्नाच

52
यह ज्यादातर अच्छी आदतें बनाने के लिए है। आपको अब स्वतंत्र धाराओं की आवश्यकता नहीं हो सकती है, लेकिन स्वेन -6-महीने-से-अब हो सकता है। यदि आप अपने पुस्तकालयों को सीधे तरीकों से उपयोग करने के लिए लिखते हैं numpy.random, तो आप बाद में स्वतंत्र स्ट्रीम नहीं बना सकते हैं। PRNG स्ट्रीम नियंत्रित करने के इरादे से लाइब्रेरी लिखना आसान है। आपके पुस्तकालय में प्रवेश करने के हमेशा कई तरीके हैं, और उनमें से प्रत्येक में बीज को नियंत्रित करने का एक तरीका होना चाहिए। PRNG ऑब्जेक्ट्स के आसपास से गुजरना उस पर निर्भर रहने की तुलना में एक क्लीनर तरीका है numpy.random.seed()। दुर्भाग्य से, इस टिप्पणी बॉक्स में अधिक उदाहरणों को शामिल करने के लिए बहुत कम है। :-)
रॉबर्ट केर्न

25
रॉबर्ट के तर्क का वर्णन करने का एक और तरीका: numpy.random.seed का उपयोग करके PRNG राज्य रखने के लिए एक वैश्विक चर का उपयोग करता है, और वही मानक कारण जो वैश्विक चर यहां लागू होते हैं।
रॉबी बसाक

9
यदि आप चाहते हैं कि PRNG स्वतंत्र हों, तो उन्हें किसी भी चीज़ के साथ बीज न दें। बस numpy.random.RandomState()बिना किसी तर्क के उपयोग करें । यह ऐसी चीज़ों के लिए आपके ऑपरेटिंग सिस्टम की सुविधाओं ( /dev/urandomयूनिक्स मशीनों और विंडोज के समतुल्य) से निकाले गए अद्वितीय मूल्यों के साथ राज्य को बीज देगा । यदि numpy.random.RandomState(1234567890)आप के लिए काम नहीं कर रहा है, तो कृपया ठीक वही दिखाए जो आपने टाइप किया था और वास्तव में आपको प्राप्त त्रुटि संदेश।
रॉबर्ट कर्ण

5
अच्छा विचार नहीं। numpy.random.RandomState()सर्वोत्तम परिणामों के लिए बिना किसी तर्क के उपयोग करें ।
राबर्ट केर्न

3

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

# Random states
def get_states(random_state, low, high, size):
    rs = np.random.RandomState(random_state)
    states = rs.randint(low=low, high=high, size=size)
    return states

# Call function
states = get_states(random_state=42, low=2, high=28347, size=25)

3

यह समझना महत्वपूर्ण है कि एक यादृच्छिक जनरेटर का बीज क्या है और कब / कैसे यह आपके कोड में सेट किया गया है (उदाहरण के लिए यहां देखें) बीज के गणितीय अर्थ के अच्छे विवरण के लिए )।

इसके लिए आपको बीज को सेट करने की आवश्यकता है:

random_state = np.random.RandomState(seed=your_favorite_seed_value)

तब random_state से यादृच्छिक संख्या उत्पन्न करना महत्वपूर्ण है और np.random से नहीं। यानी आपको करना चाहिए:

random_state.randint(...)

के बजाय

np.random.randint(...) 

जो रैंडमस्टेट () का एक नया उदाहरण बनाएगा और मूल रूप से बीज को सेट करने के लिए आपके कंप्यूटर की आंतरिक घड़ी का उपयोग करेगा।


2

मैं सिर्फ कुछ मामले में @Robert Kern जवाब के संबंध में कुछ स्पष्ट करना चाहता हूं जो स्पष्ट नहीं है। यहां तक ​​कि अगर आप उपयोग करते हैं, RandomStateतो आपको हर बार जब आप रॉबर्ट के उदाहरण में एक शानदार यादृच्छिक विधि कहते हैं, तो इसे शुरू करना होगा अन्यथा आपको निम्नलिखित परिणाम मिलेंगे।

Python 3.6.9 |Anaconda, Inc.| (default, Jul 30 2019, 19:07:31) 
[GCC 7.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>> prng = np.random.RandomState(2019)
>>> prng.randint(-1, 2, size=10)
array([-1,  1,  0, -1,  1,  1, -1,  0, -1,  1])
>>> prng.randint(-1, 2, size=10)
array([-1, -1, -1,  0, -1, -1,  1,  0, -1, -1])
>>> prng.randint(-1, 2, size=10)
array([ 0, -1, -1,  0,  1,  1, -1,  1, -1,  1])
>>> prng.randint(-1, 2, size=10)
array([ 1,  1,  0,  0,  0, -1,  1,  1,  0, -1])
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.