कैसे अजगर यादृच्छिक फेरबदल काम करता है?


11

पायथन में यादृच्छिक कार्यों से फेरबदल कैसे किया जाता है?

मैं पूछता हूं क्योंकि यह बहुत तेजी से काम करता है। जब मैं फेरबदल लिखने की कोशिश करता हूं तो यह 10 ^ 6 तत्व के लिए 1 मिनट काम करता है, लेकिन पायथन फेरबदल 8 सेकंड में करता है?


14
सिर्फ सोर्स कोड को क्यों नहीं देखा ?
आलस

4
सबसे अच्छा फेरबदल एल्गोरिथ्म फिशर-येट्स फेरबदल है, यह ओ (एन) समय में चलता है और एक आदर्श फेरबदल (अच्छा यादृच्छिक स्रोत मानते हुए) साबित होता है
शाफ़्ट फ्रीक

1
@ratchetfreak: पायथन फिशर-येट्स का उपयोग करता है।
मार्टिज़न पीटरर्स

1
फेरबदल के लिए आपका एल्गोरिथ्म क्या है?
whatsisname

@ सलोथ, वैसे, रेमंड हेटिंगर ने डॉक्स की एक सार्वभौमिक प्रथा को 2011 में वापस स्रोत कोड से जोड़ने का प्रस्ताव रखा ।
क्रिस्टियान सियुपिटु

जवाबों:


17

पायथन फिशर-येट्स फेरबदल का random.shuffleउपयोग करता है , जो ओ (एन) समय में चलता है और एक सही फेरबदल (एक अच्छा यादृच्छिक संख्या जनरेटर मानते हुए) साबित होता है।

यह पिछली से पहली प्रविष्टि तक की सरणी को पुनरावृत्त करता है, प्रत्येक प्रविष्टि को उसके नीचे एक यादृच्छिक सूचकांक में प्रविष्टि के साथ स्विच करता है।

फिशर-येट्स फेरबदल की मूल प्रक्रिया बेतरतीब ढंग से गिने हुए टिकटों को टोपी से बाहर निकालने या डेक से एक कार्ड के समान है, एक के बाद एक जब तक कि कोई और शेष न हो। विशिष्ट एल्गोरिथ्म क्या प्रदान करता है यह एक कुशल और कठोर तरीके से संख्यात्मक रूप से करने का एक तरीका है जो ठीक से किया जाता है, एक निष्पक्ष परिणाम की गारंटी देता है ...

आधुनिक ... समाधान है कि "तिरछे" नंबरों को सूची में अंतिम छोर तक ले जाया जाए, ताकि प्रत्येक पुनरावृत्ति पर उन्हें अंतिम अस्थिर संख्या के साथ स्वैप किया जा सके। यह भोली कार्यान्वयन के लिए O (n 2 ) की तुलना में O (n ) के लिए एल्गोरिथ्म की समय जटिलता को कम करता है । यह परिवर्तन निम्न एल्गोरिथ्म (शून्य-आधारित सरणी के लिए) देता है।

To shuffle an array a of n elements (indices 0..n-1):
  for i from n  1 downto 1 do
       j  random integer with 0  j  i
       exchange a[j] and a[i]
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.