2015-01-02 6 views
16

random.normalvariate() और random.gauss() के बीच क्या अंतर है?random.normalvariate() और random.gauss() अजगर में क्या अंतर है?

वे एक ही पैरामीटर लेने के लिए और समान मान, मूलतः एक ही समारोह में प्रदर्शन।

मैं previous answer से समझता हूं कि random.gauss()thread safe नहीं है, लेकिन इस संदर्भ में इसका क्या अर्थ है? प्रोग्रामर को इसके बारे में क्यों परवाह करना चाहिए? वैकल्पिक रूप से देखा गया, पाइथन के 'यादृच्छिक' में शामिल थ्रेड सुरक्षित और गैर थ्रेड सुरक्षित संस्करण दोनों क्यों थे?

उत्तर

7

कोड के थ्रेड-सुरक्षित टुकड़े निष्पादन के दौरान संभव race conditions के लिए खाते होना चाहिए। synchronization schemes के परिणामस्वरूप synchronization schemes के परिणामस्वरूप

हालांकि, यदि आप गैर-पुनर्वित्त कोड लिख रहे हैं, तो सामान्य रूप से कोई दौड़ की स्थिति उत्पन्न नहीं होती है, जिसका अनिवार्य रूप से मतलब है कि आप थोड़ा तेज़ी से निष्पादित कोड लिख सकते हैं। मुझे लगता है कि यही कारण है कि random.gauss() पेश किया गया था, क्योंकि पाइथन डॉक्टर का कहना है कि यह थ्रेड-सुरक्षित संस्करण से तेज़ है।

1

मैं पूरी तरह इस लेकिन अजगर प्रलेखन के बारे में यकीन नहीं है का कहना है कि random.gauss थोड़ा तेजी से इसलिए यदि आप सुरक्षित तो आप एक छोटे से तेजी से जा सकते हैं गैर धागे से ठीक कर रहे है।

0

बहु-थ्रेडेड सिस्टम में, random.normalvariate को उत्तराधिकार में दो बार बहुत जल्दी कॉल करने से random.normalvariate का आंतरिक कोड दो बार चलाने के लिए होता है, संभावित रूप से पहले कॉल को वापस आने का मौका मिलने से पहले। फ़ंक्शन का आंतरिक चर दूसरे से पहले रीसेट नहीं किया जा सकता है, जो फ़ंक्शन आउटपुट में त्रुटियों का कारण बन सकता है। random.gauss को

लगातार कॉल के बजाय पहले कॉल खुद को बुलाया जा रहा है इससे पहले कि वापस जाने के लिए प्रतीक्षा करनी होगी।

random.normalvariate के साथ लाभ इसलिए है कि यह तेज़ है, लेकिन एक गलत आउटपुट उत्पन्न कर सकता है।

+2

इसमें कुछ समय भ्रामक है: उदाहरण के लिए, normalvariatestr_nv में कुछ Kinderman और मोनाहन विधि कहा जाता है, निम्नलिखित टिप्पणियों के अनुसार उपयोग करता है। क्या आपने random.gauss और random.normalvariate की थ्रेड सुरक्षा को मिश्रित किया है? –

13

यह एक दिलचस्प सवाल है।

import inspect, random 
str_gauss = inspect.getsource(random.gauss) 
str_nv=inspect.getsource(random.normalvariate) 

और फिर आप तार के प्रत्येक प्रिंट देखने के लिए कैसे स्रोतों अलग: सामान्य में, सबसे अच्छा तरीका है दो अजगर कार्यान्वयन में अंतर जानना कोड खुद निरीक्षण करने के लिए है। कोडों पर एक त्वरित रूप से पता चलता है कि न केवल वे अलग-अलग बहु-व्यवहार के साथ व्यवहार करते हैं, बल्कि यह भी कि एल्गोरिदम समान नहीं हैं;

# Uses Kinderman and Monahan method. Reference: Kinderman, 
# A.J. and Monahan, J.F., "Computer generation of random 
# variables using the ratio of uniform deviates", ACM Trans 
# Math Software, 3, (1977), pp257-260. 
+0

यह दुख की बात है कि इस तरह के दस्तावेज दस्तावेज में नहीं मिल सकते हैं। कोई अंतर्दृष्टि क्यों हो सकती है? – hkBst

संबंधित मुद्दे