Fisher–Yates shuffle
फिशर-येट्स फेरबदल एक सीमित अनुक्रम को बदलने के लिए एक एल्गोरिथ्म है। एल्गोरिथ्म अनुक्रम के सभी तत्वों की एक सूची लेता है, और लगातार सूची से एक तत्व को यादृच्छिक रूप से खींचकर शफल्ड अनुक्रम में अगले तत्व को निर्धारित करता है जब तक कि कोई तत्व नहीं रहता है। एल्गोरिथ्म एक निष्पक्ष क्रमपरिवर्तन उत्पन्न करता हैः प्रत्येक क्रमपरिवर्तन समान रूप से संभव है। एल्गोरिथम के आधुनिक संस्करण में वस्तुओं की संख्या के समानुपाती समय लगता है और उन्हें जगह-जगह बदल दिया जाता है। फिशर-येट्स फेरबदल का नाम रोनाल्ड फिशर और फ्रैंक येट्स के नाम पर रखा गया है, जिन्होंने पहली बार इसका वर्णन किया था, और इसे डोनाल्ड नुथ के नाम पर नुथ फेरबदल के रूप में भी जाना जाता है। फिशर-येट्स फेरबदल का एक प्रकार, जिसे सत्तोलो के एल्गोरिथ्म के रूप में जाना जाता है, का उपयोग यादृच्छिक क्रमपरिवर्तन के बजाय लंबाई n के यादृच्छिक चक्रीय क्रमपरिवर्तन उत्पन्न करने के लिए किया जा सकता है। फिशर और येट्स की मूल विधि द फिशर-येट्स शफल, अपने मूल रूप में, 1938 में रोनाल्ड फिशर और फ्रैंक येट्स द्वारा जैविक, कृषि और चिकित्सा अनुसंधान के लिए अपनी पुस्तक सांख्यिकीय तालिकाओं में वर्णित की गई थी। एल्गोरिथ्म के उनके विवरण में पेंसिल और कागज का उपयोग किया गया था; यादृच्छिक संख्याओं की एक तालिका यादृच्छिकता प्रदान करती है। 1 से N तक की संख्याओं का यादृच्छिक क्रमपरिवर्तन उत्पन्न करने के लिए दी गई मूल विधि इस प्रकार हैः 1 से N तक की संख्याओं को लिखें। एक और शेष (समावेशी) अप्रचलित संख्याओं की संख्या के बीच एक यादृच्छिक संख्या k चुनें। निचले छोर से गिनती करते हुए, kth संख्या को बाहर निकालें जो अभी तक समाप्त नहीं हुई है, और इसे एक अलग सूची के अंत में लिखें। चरण 2 से तब तक दोहराएं जब तक कि सभी संख्याएँ समाप्त नहीं हो जाती हैं। चरण 3 में लिखी गई संख्याओं का अनुक्रम अब मूल संख्याओं का यादृच्छिक क्रमपरिवर्तन है। बशर्ते कि उपरोक्त चरण 2 में चुनी गई यादृच्छिक संख्याएँ वास्तव में यादृच्छिक और निष्पक्ष हों, इसलिए परिणामी क्रमपरिवर्तन होगा। फिशर और येट्स ने यह वर्णन करने का ध्यान रखा कि आपूर्ति की गई तालिकाओं से किसी भी वांछित सीमा में ऐसी यादृच्छिक संख्याओं को इस तरह से कैसे प्राप्त किया जाए जो किसी भी पूर्वाग्रह से बच जाए। उन्होंने एक सरल विधि का उपयोग करने की संभावना का भी सुझाव दिया-एक से एन तक यादृच्छिक संख्याओं को चुनना और किसी भी डुप्लिकेट को त्यागना-क्रमपरिवर्तन के पहले आधे हिस्से को उत्पन्न करने के लिए, और केवल शेष आधे हिस्से में अधिक जटिल एल्गोरिथ्म को लागू करना, जहां एक डुप्लिकेट संख्या चुनना अन्यथा निराशाजनक रूप से आम हो जाएगा। आधुनिक एल्गोरिथ्म कंप्यूटर उपयोग के लिए डिज़ाइन किए गए फिशर-येट्स शफल का आधुनिक संस्करण, 1964 में रिचर्ड डर्स्टनफेल्ड द्वारा पेश किया गया था और डोनाल्ड ई. नुथ द्वारा द आर्ट ऑफ कंप्यूटर प्रोग्रामिंग में "एल्गोरिथम पी (शफ़लिंग)" के रूप में लोकप्रिय किया गया था। न तो डर्स्टनफेल्ड के लेख और न ही द आर्ट ऑफ कंप्यूटर प्रोग्रामिंग के क्नुथ के पहले संस्करण ने फिशर और येट्स के काम को स्वीकार किया; वे इसके बारे में नहीं जानते होंगे। क्नुथ के द आर्ट ऑफ कंप्यूटर प्रोग्रामिंग के बाद के संस्करणों में फिशर और येट्स के योगदान का उल्लेख है। डर्स्टनफेल्ड द्वारा वर्णित एल्गोरिथ्म फिशर और येट्स द्वारा दिए गए एल्गोरिथ्म की तुलना में अधिक कुशल हैः जबकि फिशर और येट्स की विधि का एक सरल कंप्यूटर कार्यान्वयन उपरोक्त चरण 3 में शेष संख्याओं को गिनने में अनावश्यक समय बिताएगा, डर्स्टनफेल्ड का समाधान "प्रहारित" संख्याओं को प्रत्येक पुनरावृत्ति में अंतिम अप्रभावित संख्या के साथ अदला-बदली करके सूची के अंत में ले जाना है। यह सरल कार्यान्वयन की तुलना में एल्गोरिथ्म की समय जटिलता को कम करता है। यह परिवर्तन निम्नलिखित एल्गोरिथ्म (शून्य-आधारित सरणी के लिए) देता है। --n तत्वों की एक सरणी को फेरबदल करने के लिए (सूचकांक 0.n-1): i के लिए n-1 से 1 तक यादृच्छिक पूर्णांक इस तरह से करें कि 0 ≤ j ≤ i एक [j] और एक [i] का आदान-प्रदान करें एक समतुल्य संस्करण जो सरणी को विपरीत दिशा में बदल देता है (निम्नतम सूचकांक से उच्चतम तक) हैः-- n तत्वों की एक सरणी को फेरबदल करने के लिए (सूचकांक 0.n-1): i के लिए 0 से n-2 तक यादृच्छिक पूर्णांक ऐसा करें कि i ≤ j <n एक [i] और एक [j] का आदान-प्रदान करें उदाहरण पेंसिल-और-पेपर विधि यह उदाहरण फिशर और येट्स की मूल विधि का उपयोग करके A से H तक के अक्षरों को क्रमबद्ध करता है। उदाहरण के लिए, यदि जे = 3 है, तो कोई तीसरे अक्षर को खरोंच पैड पर मारता है और इसे परिणाम के रूप में लिख देता हैः एक दूसरी यादृच्छिक संख्या चुनी जाती है, इस बार 1 से 7 तक। यदि संख्या 4 है, तो कोई चौथे अक्षर को बाहर निकालता है जो अभी तक स्क्रैच पैड से नहीं निकला है और इसे परिणाम में जोड़ता हैः अगली यादृच्छिक संख्या 1 से 6 तक चुनी जाती है, और फिर 1 से 5 तक, और इसी तरह, हमेशा ऊपर की तरह स्ट्राइक-आउट प्रक्रिया को दोहराते हैंः डर्स्टनफेल्ड के एल्गोरिथम के संस्करण में, चुने गए अक्षरों को बाहर निकालने और उन्हें कहीं और कॉपी करने के बजाय, उन्हें अंतिम अक्षर के साथ बदल दिया जाता है जो अभी तक नहीं चुना गया है। पहले की तरह ए से एच तक के अक्षरों से शुरू करते हुएः 1 से 8 तक की यादृच्छिक संख्या जे का चयन करें, और फिर जे. टी. एच. और 8वें अक्षरों की अदला-बदली करें। इसलिए, यदि यादृच्छिक संख्या 6 है, उदाहरण के लिए, सूची में छठे और आठवें अक्षरों को बदलेंः अगली यादृच्छिक संख्या 1 से 7 तक चुनी जाती है, और चयनित अक्षर को 7वें अक्षर के साथ बदला जाता है। उदाहरण के लिए, यदि यह 2 है, तो दूसरे और सातवें अक्षरों को बदलेंः क्रमपरिवर्तन पूरा होने तक प्रक्रिया को दोहराया जाता हैः आठ चरणों के बाद, एल्गोरिथ्म पूरा हो जाता है और परिणामी क्रमपरिवर्तन जी. ई. डी. सी. ए. एच. बी. एफ. होता है। अर्थात्, एक पूर्व-प्रारंभिक सरणी को देखते हुए, यह सरणी की एक शफल्ड प्रति का उत्पादन करने के बजाय सरणी के तत्वों को बदल देता है। यह एक लाभ हो सकता है यदि फेरबदल की जाने वाली सरणी बड़ी है। एक सरणी को एक साथ आरंभ करने और फेरबदल करने के लिए, फेरबदल का "इनसाइड-आउट" संस्करण करके थोड़ी अधिक दक्षता प्राप्त की जा सकती है। इस संस्करण में, एक क्रमिक रूप से तत्व संख्या i को सरणी में पहले i पदों के बीच एक यादृच्छिक स्थिति में रखता है, पहले उस स्थिति पर कब्जा करने वाले तत्व को i स्थिति में स्थानांतरित करने के बाद। यदि यादृच्छिक स्थिति संख्या i होती है, तो इस "चाल" (उसी स्थान पर) में एक प्रारंभिक मूल्य शामिल होता है, लेकिन इससे कोई फर्क नहीं पड़ता, क्योंकि मूल्य को तुरंत अधिलेखित कर दिया जाता है। कोई अलग आरंभीकरण की आवश्यकता नहीं है, और कोई विनिमय नहीं किया जाता है। सामान्य मामले में जहां स्रोत को कुछ सरल फलन द्वारा परिभाषित किया जाता है, जैसे कि 0 से n-1 तक के पूर्णांक, स्रोत को बस फलन के साथ प्रतिस्थापित किया जा सकता है क्योंकि निष्पादन के दौरान स्रोत को कभी नहीं बदला जाता है। n तत्वों की एक सरणी को स्रोत की यादृच्छिक रूप से फेरबदल की गई प्रति से आरंभ करने के लिए, दोनों 0-आधारितः i के लिए 0 से n-1 तक यादृच्छिक पूर्णांक इस तरह से करें कि 0 ≤ j ≤ i यदि j ≤ i a [i] ≤ a [j] a [j] ≤ स्रोत [i] अंदर-बाहर फेरबदल को प्रेरण द्वारा सही देखा जा सकता है। एक पूर्ण यादृच्छिक संख्या जनरेटर मानते हुए, प्रत्येक एन! यादृच्छिक संख्याओं के विभिन्न अनुक्रम जो यादृच्छिक कॉल से प्राप्त किए जा सकते हैं, मूल्यों का एक अलग क्रमपरिवर्तन उत्पन्न करेंगे, इसलिए ये सभी ठीक एक बार प्राप्त किए जाते हैं। शर्त जो जाँच करती है कि क्या जे ष्णू आई को उन भाषाओं में छोड़ा जा सकता है जिनमें शुरुआत न किए गए सरणी मानों तक पहुँचने में कोई समस्या नहीं है। यह Hn ≈ ln n + γ अनावश्यक कार्यों की अपेक्षित लागत पर n सशर्त शाखाओं को समाप्त कर देता है। इस तकनीक का एक और लाभ यह है कि n, स्रोत में तत्वों की संख्या, को पहले से जानने की आवश्यकता नहीं है; हमें केवल स्रोत डेटा के अंत का पता लगाने में सक्षम होने की आवश्यकता है जब यह पहुंच जाता है। सरणी के नीचे a को खाली से शुरू करके पुनरावृत्त रूप से बनाया जाता है, और a.length देखे गए तत्वों की वर्तमान संख्या का प्रतिनिधित्व करता है। एक खाली सरणी को स्रोत की यादृच्छिक रूप से फेरबदल की गई प्रतिलिपि के लिए आरंभ करने के लिए जिसकी लंबाई ज्ञात नहीं हैः जबकि source.moreDataAvailable j-यादृच्छिक पूर्णांक ऐसा है कि 0 ≤ j ≤ a.length यदि j = a.length a.append (source.next) अन्यथा a.append (a [[j]) a [j]-source.next सैटोलो का एल्गोरिथ्म एक बहुत ही समान एल्गोरिथ्म 1986 में सैंड्रा सैटोलो द्वारा (अधिकतम) लंबाई n के समान रूप से वितरित चक्रों को उत्पन्न करने के लिए प्रकाशित किया गया था। डर्स्टनफेल्ड और सैटोलो के एल्गोरिथ्म के बीच एकमात्र अंतर यह है कि बाद वाले में, ऊपर दिए गए चरण 2 में, यादृच्छिक संख्या जे को बीच की सीमा से चुना जाता है। यह सरल परिवर्तन एल्गोरिथ्म को संशोधित करता है ताकि परिणामी क्रमपरिवर्तन में हमेशा एक ही चक्र हो। वास्तव में, जैसा कि नीचे वर्णित है, जब साधारण फिशर-येट्स फेरबदल का इरादा होता है तो गलती से सत्तोलो के एल्गोरिदम को लागू करना काफी आसान होता है। यह (n−1) के छोटे समूह से क्रमपरिवर्तनों को चुनने के लिए प्रेरित करके परिणामों को पक्षपाती बना देगा! लंबाई एन के चक्र, सभी एन के पूर्ण सेट के बजाय! संभावित क्रमपरिवर्तन। यह तथ्य कि सत्तोलो का एल्गोरिथ्म हमेशा लंबाई n का एक चक्र उत्पन्न करता है, प्रेरण द्वारा दिखाया जा सकता है। प्रेरण द्वारा मान लीजिए कि लूप की प्रारंभिक पुनरावृत्ति के बाद, शेष पुनरावृत्तियाँ n-1 लंबाई के चक्र के अनुसार पहले n-1 तत्वों को क्रमबद्ध करती हैं (वे शेष पुनरावृत्तियाँ केवल उन पहले n-1 तत्वों पर लागू सैटोलो के एल्गोरिदम हैं)। इसका मतलब है कि प्रारंभिक तत्व को उसकी नई स्थिति पी में ट्रेस करना, फिर मूल रूप से स्थिति पी पर तत्व को अपनी नई स्थिति में लाना, और इसी तरह, कोई अन्य सभी स्थितियों का दौरा करने के बाद ही प्रारंभिक स्थिति में वापस आ जाता है। मान लीजिए कि प्रारंभिक पुनरावृत्ति ने अंतिम तत्व को (गैर-अंतिम) स्थिति k पर एक के साथ बदल दिया, और पहले n−1 तत्वों के बाद के क्रमपरिवर्तन ने इसे स्थिति l में स्थानांतरित कर दिया; हम सभी n तत्वों के क्रमपरिवर्तन की तुलना पहले n−1 तत्वों के उस शेष क्रमपरिवर्तन σ के साथ करते हैं। जैसा कि अभी उल्लेख किया गया है, क्रमिक स्थितियों का पता लगाने से, स्थिति k पर पहुंचने तक π और σ के बीच कोई अंतर नहीं होता है। लेकिन फिर, π के तहत मूल रूप से स्थिति k पर तत्व को स्थिति l के बजाय अंतिम स्थिति में ले जाया जाता है, और मूल रूप से अंतिम स्थिति में तत्व को स्थिति l पर ले जाया जाता है। वहाँ से, π के लिए स्थितियों का अनुक्रम फिर से σ के लिए अनुक्रम का अनुसरण करता है, और आवश्यकतानुसार प्रारंभिक स्थिति पर वापस आने से पहले सभी स्थितियों का दौरा किया जाएगा। जहां तक क्रमपरिवर्तनों की समान संभावना की बात है, यह देखना पर्याप्त है कि संशोधित एल्गोरिथ्म में (एन-1) शामिल है! उत्पादित यादृच्छिक संख्याओं के अलग-अलग संभावित अनुक्रम, जिनमें से प्रत्येक स्पष्ट रूप से एक अलग क्रमपरिवर्तन उत्पन्न करता है, और जिनमें से प्रत्येक होता है-यह मानते हुए कि यादृच्छिक संख्या स्रोत निष्पक्ष है-समान संभावना के साथ। (एन-1)! इस प्रकार उत्पन्न विभिन्न क्रमपरिवर्तन लंबाई n के चक्रों के समूह को सटीक रूप से समाप्त कर देते हैंः ऐसे प्रत्येक चक्र में अंतिम स्थिति में मान n के साथ एक अद्वितीय चक्र संकेतन होता है, जो (n−1) के लिए अनुमति देता है! चक्र संकेतन की अन्य स्थितियों को भरने के लिए शेष मूल्यों के क्रमपरिवर्तन। पायथन में सैटोलो के एल्गोरिदम का एक नमूना कार्यान्वयन हैः यादृच्छिक आयात रैंडरेंज डेफ सैटोलो _ साइकिल (आइटम)-> कोई नहीं सेः "सैटोलो का एल्गोरिदम"। आई = लेन (आइटम) जबकि आई> 1: आई = आई-1 जे = यादृच्छिक (आई) #0 <= जे <= आई-1 आइटम [जे], आइटम [आई] = आइटम [आई], आइटम [जे] अन्य फेरबदल एल्गोरिदम के साथ तुलना फिशर-येट्स फेरबदल की स्पर्शोन्मुख समय और स्थान जटिलता इष्टतम हैं। एक उच्च गुणवत्ता वाले निष्पक्ष यादृच्छिक संख्या स्रोत के साथ संयुक्त, यह भी निष्पक्ष परिणाम देने की गारंटी है। कुछ अन्य समाधानों की तुलना में, इसका यह भी लाभ है कि, यदि परिणामी क्रमपरिवर्तन के केवल एक हिस्से की आवश्यकता है, तो इसे आधे रास्ते से रोका जा सकता है, या यहां तक कि रोका जा सकता है और बार-बार फिर से शुरू किया जा सकता है, जिससे आवश्यकतानुसार क्रमपरिवर्तन बढ़ता है। निष्कपट विधि सभी तत्वों से यादृच्छिक रूप से चुने गए किसी अन्य तत्व के साथ प्रत्येक तत्व की अदला-बदली करने की सरल विधि पक्षपाती है। अलग-अलग क्रमपरिवर्तन में उत्पन्न होने की अलग-अलग संभावनाएँ होंगी, प्रत्येक के लिए, क्योंकि अलग-अलग क्रमपरिवर्तन की संख्या, एल्गोरिथ्म के यादृच्छिक परिणामों की संख्या को समान रूप से विभाजित नहीं करती है। विशेष रूप से, बर्ट्रैंड के अभिधारणा के अनुसार और के बीच कम से कम एक अभाज्य संख्या होगी, और यह संख्या विभाजित होगी लेकिन विभाजित नहीं होगी। यादृच्छिक आयात रैंडरेंज डेफ नाइव _ शफल (आइटम)-> कोई नहीं सेः "" एक सरल विधि। यह एक उदाहरण है कि क्या नहीं करना चाहिए-इसके बजाय फिशर-येट्स का उपयोग करें। एन = लेन (आइटम) रेंज (एन) में आई के लिएः जे = रैंडरेंज (एन) #0 <= जे <= एन-1 आइटम [जे], आइटम [आई] = आइटम [आई], आइटम [जे] सॉर्टिंग एक वैकल्पिक विधि सेट के प्रत्येक तत्व को एक यादृच्छिक संख्या प्रदान करती है जिसे फेरबदल किया जाना है और फिर सेट को निर्धारित संख्याओं के अनुसार क्रमबद्ध किया जाता है। छँटाई विधि में फिशर-येट्स के समान ही असिम्प्टोटिक समय जटिलता हैः हालांकि सामान्य छँटाई ओ (एन लॉग एन) है, ओ (एन) समय में रेडिक्स छँटाई का उपयोग करके संख्याओं को कुशलता से छँटाया जाता है। फिशर-येट्स फेरबदल की तरह, छँटाई विधि निष्पक्ष परिणाम देती है। हालाँकि, यह सुनिश्चित करने के लिए ध्यान रखा जाना चाहिए कि निर्धारित यादृच्छिक संख्याएँ कभी भी डुप्लिकेट न हों, क्योंकि सॉर्टिंग एल्गोरिदम आमतौर पर एक टाई के मामले में तत्वों को यादृच्छिक रूप से ऑर्डर नहीं करते हैं। इसके अतिरिक्त, इस विधि के लिए स्पर्शोन्मुख रूप से बड़े स्थान की आवश्यकता होती हैः यादृच्छिक संख्याओं के लिए ओ (एन) अतिरिक्त भंडारण स्थान, बनाम फिशर-येट्स फेरबदल के लिए ओ (1) स्थान। अंत में, छँटाई विधि में एक सरल समानांतर कार्यान्वयन होता है, जो फिशर-येट्स फेरबदल के विपरीत है, जो क्रमिक है। उपरोक्त विधि का एक प्रकार जिसमें उन भाषाओं में कुछ उपयोग देखा गया है जो उपयोगकर्ता-निर्दिष्ट तुलना कार्यों के साथ छँटाई का समर्थन करती हैं, एक सूची को एक तुलना कार्य के साथ छँटाई करके फेरबदल करना है जो यादृच्छिक मान देता है। हालांकि, यह अत्यधिक गैर-समान वितरण का उत्पादन करने की बहुत संभावना है, जो इसके अलावा उपयोग किए गए छँटाई एल्गोरिदम पर बहुत अधिक निर्भर करता है। उदाहरण के लिए मान लीजिए कि क्विकसोर्ट का उपयोग सॉर्टिंग एल्गोरिथ्म के रूप में किया जाता है, जिसमें एक निश्चित तत्व को पहले धुरी तत्व के रूप में चुना जाता है। एल्गोरिथ्म धुरी की तुलना अन्य सभी तत्वों के साथ करना शुरू कर देता है ताकि उन्हें उन कम और उससे बड़े तत्वों में अलग किया जा सके, और उन समूहों के सापेक्ष आकार धुरी तत्व के अंतिम स्थान का निर्धारण करेंगे। एक समान रूप से वितरित यादृच्छिक क्रमपरिवर्तन के लिए, प्रत्येक संभावित अंतिम स्थिति धुरी तत्व के लिए समान रूप से संभावित होनी चाहिए, लेकिन यदि प्रत्येक प्रारंभिक तुलना समान संभावना के साथ "कम" या "अधिक" लौटती है, तो उस स्थिति में पी = 1/2 के लिए एक द्विपद वितरण होगा, जो सिरों के पास की स्थितियों की तुलना में बहुत अधिक संभावना के साथ अनुक्रम के बीच के पास की स्थिति देता है। अन्य छँटाई विधियों जैसे कि मर्ज सॉर्ट पर लागू यादृच्छिक तुलना कार्य ऐसे परिणाम उत्पन्न कर सकते हैं जो अधिक समान दिखाई देते हैं, लेकिन बिल्कुल भी नहीं हैं, क्योंकि दो अनुक्रमों को बार-बार समान संभावना के साथ चुनकर (जब तक कि एक अनुक्रम के समाप्त होने से विकल्प को मजबूर नहीं किया जाता है) एक समान वितरण के साथ परिणाम नहीं देता है; इसके बजाय एक अनुक्रम चुनने की संभावना उसमें बचे हुए तत्वों की संख्या के समानुपाती होनी चाहिए। वास्तव में कोई भी विधि जो समान संभाव्यता ("सिक्का फ़्लिपिंग") के साथ केवल दो-तरफा यादृच्छिक घटनाओं का उपयोग करती है, एक सीमित संख्या में बार-बार दोहराती है, एक समान वितरण के साथ एक अनुक्रम (दो से अधिक तत्वों के) के क्रमपरिवर्तन का उत्पादन कर सकती है, क्योंकि प्रत्येक निष्पादन पथ में विभाजक के रूप में 2 की शक्ति के साथ एक परिमेय संख्या होगी, जबकि आवश्यक संभाव्यता 1/n! प्रत्येक संभावित क्रमपरिवर्तन के लिए उस रूप का नहीं है। सिद्धांत रूप में इस फेरबदल विधि के परिणामस्वरूप अंतहीन लूप या अभिगम उल्लंघन जैसे कार्यक्रम विफल हो सकते हैं, क्योंकि एक छँटाई एल्गोरिथ्म की शुद्धता क्रम संबंध (जैसे पारगमन) के गुणों पर निर्भर कर सकती है जो यादृच्छिक मूल्यों का उत्पादन करने वाली तुलना में निश्चित रूप से नहीं होगी। हालांकि इस तरह का व्यवहार छंटाई दिनचर्या के साथ नहीं होना चाहिए जो कभी भी ऐसी तुलना नहीं करता है जिसके परिणाम की निश्चितता के साथ भविष्यवाणी की जा सकती है (पिछली तुलनाओं के आधार पर), जानबूझकर ऐसी तुलना करने के वैध कारण हो सकते हैं। उदाहरण के लिए यह तथ्य कि किसी भी तत्व की तुलना स्वयं के बराबर होनी चाहिए, उन्हें दक्षता कारणों से प्रहरी मूल्य के रूप में उपयोग करने की अनुमति देता है, और यदि ऐसा है, तो एक यादृच्छिक तुलना कार्य छँटाई एल्गोरिथ्म को तोड़ देगा। फिशर-येट्स फेरबदल को लागू करते समय पूर्वाग्रह के संभावित स्रोतों की देखभाल की जानी चाहिए, दोनों एल्गोरिदम के कार्यान्वयन में और यादृच्छिक संख्याओं के उत्पादन में जो इसे बनाया गया है, अन्यथा परिणाम पता लगाने योग्य पूर्वाग्रह दिखा सकते हैं। पक्षपात के कई सामान्य स्रोतों को नीचे सूचीबद्ध किया गया है। फिशर-येट्स फेरबदल को लागू करते समय एक आम त्रुटि गलत सीमा से यादृच्छिक संख्याओं को चुनना है। त्रुटिपूर्ण एल्गोरिथ्म सही ढंग से काम करता प्रतीत हो सकता है, लेकिन यह समान संभावना के साथ प्रत्येक संभावित क्रमपरिवर्तन का उत्पादन नहीं करेगा, और यह कुछ निश्चित क्रमपरिवर्तन का उत्पादन नहीं कर सकता है। उदाहरण के लिए, एक आम ऑफ-बाय-वन त्रुटि उपरोक्त उदाहरण में अदला-बदली करने के लिए प्रविष्टि के सूचकांक जे को चुनना होगा जो हमेशा प्रविष्टि के सूचकांक i से सख्ती से कम होगा जिसके साथ इसे अदला-बदली की जाएगी। यह फिशर-येट्स फेरबदल को सत्तोलो के एल्गोरिथ्म में बदल देता है, जो सभी तत्वों को शामिल करते हुए एक ही चक्र से युक्त केवल क्रमपरिवर्तन पैदा करता हैः विशेष रूप से, इस संशोधन के साथ, सरणी का कोई भी तत्व कभी भी अपनी मूल स्थिति में समाप्त नहीं हो सकता है। इसी तरह, हमेशा प्रत्येक पुनरावृत्ति पर वैध सरणी सूचकांकों की पूरी श्रृंखला से जे का चयन भी एक ऐसा परिणाम उत्पन्न करता है जो पक्षपाती है, हालांकि कम स्पष्ट रूप से ऐसा है। यह इस तथ्य से देखा जा सकता है कि ऐसा करने से अदला-बदली के अलग-अलग संभावित अनुक्रम प्राप्त होते हैं, जबकि केवल एन! एन-तत्व सरणी के संभावित क्रमपरिवर्तन। चूँकि nn को कभी भी n से समान रूप से विभाजित नहीं किया जा सकता है! जब n> 2 (जैसा कि बाद वाला n-1 से विभाज्य है, जो n के साथ कोई अभाज्य कारक साझा नहीं करता है), तो कुछ क्रमपरिवर्तन अन्य की तुलना में अदला-बदली के अधिक nn अनुक्रमों द्वारा उत्पन्न किए जाने चाहिए। इस पूर्वाग्रह के एक ठोस उदाहरण के रूप में, तीन-तत्व सरणी [1,2,3] को बदलने के संभावित परिणामों के वितरण का निरीक्षण करें। इस सरणी के 6 संभावित क्रमपरिवर्तन हैं (3! = 6), लेकिन एल्गोरिथ्म 27 संभावित फेरबदल (33 = 27) उत्पन्न करता है। इस मामले में, [1,2,3], [3,1,2], और [3,2,1] प्रत्येक 27 फेरबदलों में से 4 का परिणाम है, जबकि शेष 3 क्रमपरिवर्तनों में से प्रत्येक 27 फेरबदलों में से 5 में होता है। दाहिनी ओर का मैट्रिक्स लंबाई 7 की सूची में प्रत्येक तत्व की किसी अन्य स्थिति में समाप्त होने की संभावना को दर्शाता है। ध्यान दें कि अधिकांश तत्वों के लिए, उनकी मूल स्थिति (मैट्रिक्स का मुख्य विकर्ण) में समाप्त होने की संभावना सबसे कम होती है, और एक स्थान को पीछे की ओर ले जाने की संभावना सबसे अधिक होती है। मॉड्यूलो बायस फिशर-येट्स फेरबदल करने में विभिन्न श्रेणियों से समान रूप से वितरित यादृच्छिक पूर्णांकों को चुनना शामिल है। हालाँकि, अधिकांश यादृच्छिक संख्या जनरेटर-चाहे वे सही हों या छद्म-केवल सीधे 0 से RAND _ MAX तक की एक निश्चित सीमा में संख्याएँ प्रदान करेंगे, और कुछ पुस्तकालयों में, RAND _ MAX 32767 जितना कम हो सकता है। ऐसी संख्याओं को वांछित सीमा में मजबूर करने का एक सरल और सामान्य रूप से उपयोग किया जाने वाला तरीका मॉड्यूलो ऑपरेटर को लागू करना है; यानी, उन्हें सीमा के आकार से विभाजित करना और शेष लेना। हालाँकि, 0-1 से 0-n तक की प्रत्येक श्रेणी में यादृच्छिक संख्याएँ उत्पन्न करने के लिए फिशर-येट्स फेरबदल की आवश्यकता लगभग इस बात की गारंटी देती है कि इनमें से कुछ श्रेणियाँ यादृच्छिक संख्या जनरेटर की प्राकृतिक सीमा को समान रूप से विभाजित नहीं करेंगी। इस प्रकार, अवशेषों को हमेशा समान रूप से वितरित नहीं किया जाएगा और इससे भी बदतर, पूर्वाग्रह व्यवस्थित रूप से छोटे अवशेषों के पक्ष में होगा। उदाहरण के लिए, मान लीजिए कि आपका यादृच्छिक संख्या स्रोत 0 से 99 तक की संख्या देता है (जैसा कि फिशर और येट्स की मूल तालिकाओं के मामले में था), और आप 0 से 15 तक एक निष्पक्ष यादृच्छिक संख्या प्राप्त करना चाहते हैं। यदि आप केवल संख्याओं को 16 से विभाजित करते हैं और शेष लेते हैं, तो आप पाएंगे कि 0-3 संख्याएँ दूसरों की तुलना में लगभग 17 प्रतिशत अधिक होती हैं। ऐसा इसलिए है क्योंकि 16 समान रूप से 100 को विभाजित नहीं करता हैः 100 से कम या उसके बराबर 16 का सबसे बड़ा गुणक 6 × 16 = 96 है, और यह अधूरी सीमा 96-99 में संख्याएँ हैं जो पूर्वाग्रह का कारण बनती हैं। समस्या को ठीक करने का सबसे सरल तरीका यह है कि शेष लेने से पहले उन संख्याओं को त्याग दिया जाए और उपयुक्त सीमा में एक संख्या आने तक फिर से प्रयास करते रहें। जबकि सिद्धांत रूप में यह, सबसे खराब स्थिति में, हमेशा के लिए ले सकता है, पुनः प्रयासों की अपेक्षित संख्या हमेशा एक से कम होगी। एक संबंधित समस्या कार्यान्वयन के साथ होती है जो पहले एक यादृच्छिक फ्लोटिंग-पॉइंट संख्या उत्पन्न करती है-आमतौर पर सीमा में [0,1]-और फिर इसे वांछित सीमा के आकार से गुणा करें और नीचे गोल करें। यहाँ समस्या यह है कि यादृच्छिक फ़्लोटिंग-पॉइंट संख्याएँ, हालाँकि सावधानीपूर्वक उत्पन्न की जाती हैं, हमेशा केवल सीमित सटीकता होती हैं। इसका मतलब है कि किसी भी सीमा में संभावित फ्लोटिंग पॉइंट मानों की केवल एक सीमित संख्या होती है, और यदि सीमा को कई खंडों में विभाजित किया जाता है जो इस संख्या को समान रूप से विभाजित नहीं करते हैं, तो कुछ खंड दूसरों की तुलना में अधिक संभावित मूल्यों के साथ समाप्त होंगे। जबकि परिणामी पूर्वाग्रह पिछले मामले की तरह ही व्यवस्थित रूप से नीचे की ओर रुझान नहीं दिखाएगा, यह अभी भी रहेगा। स्यूडोरैंडम जनरेटर एक अतिरिक्त समस्या तब होती है जब फिशर-येट्स शफल का उपयोग एक स्यूडोरैंडम नंबर जनरेटर या पी. आर. एन. जी. के साथ किया जाता हैः क्योंकि इस तरह के जनरेटर द्वारा संख्या उत्पादन का अनुक्रम पूरी तरह से एक अनुक्रम की शुरुआत में इसकी आंतरिक स्थिति से निर्धारित होता है, इस तरह के जनरेटर द्वारा संचालित एक शफल संभवतः जनरेटर की विशिष्ट संभावित स्थितियों की तुलना में अधिक विशिष्ट क्रमपरिवर्तन का उत्पादन नहीं कर सकता है। यहां तक कि जब संभावित अवस्थाओं की संख्या क्रमपरिवर्तन की संख्या से अधिक हो जाती है, तो संख्याओं के अनुक्रमों से क्रमपरिवर्तन तक मानचित्रण की अनियमित प्रकृति का मतलब है कि कुछ क्रमपरिवर्तन दूसरों की तुलना में अधिक बार होंगे। इस प्रकार, पूर्वाग्रह को कम करने के लिए, पी. आर. एन. जी. की अवस्थाओं की संख्या परिमाण के कम से कम कई क्रमों द्वारा क्रमपरिवर्तन की संख्या से अधिक होनी चाहिए। उदाहरण के लिए, कई प्रोग्रामिंग भाषाओं और/या पुस्तकालयों द्वारा प्रदान किए गए बिल्ट-इन स्यूडोरैंडम नंबर जनरेटर में अक्सर आंतरिक अवस्था के केवल 32 बिट हो सकते हैं, जिसका अर्थ है कि यह केवल 232 विभिन्न अनुक्रमों की संख्या का उत्पादन कर सकता है। यदि इस तरह के जनरेटर का उपयोग 52 ताशों के डेक को फेरबदल करने के लिए किया जाता है, तो यह कभी भी 52 का बहुत छोटा अंश ही उत्पन्न कर सकता है! ≈ 2225.6 संभावित क्रमपरिवर्तन। 226 बिट से कम आंतरिक अवस्था वाले जनरेटर के लिए 52-कार्ड डेक के सभी संभावित क्रमपरिवर्तन का उत्पादन करना असंभव है। कोई भी स्यूडोरैंडम संख्या जनरेटर अधिक विशिष्ट अनुक्रमों का उत्पादन नहीं कर सकता है, जो आरंभीकरण के बिंदु से शुरू होता है, जहां अलग-अलग बीज मूल्य होते हैं जिनके साथ इसे आरंभ किया जा सकता है। इस प्रकार, एक जनरेटर जिसमें 1024 बिट आंतरिक अवस्था होती है, लेकिन जिसे 32-बिट बीज के साथ आरंभ किया जाता है, अभी भी आरंभीकरण के तुरंत बाद केवल 232 अलग-अलग क्रमपरिवर्तन का उत्पादन कर सकता है। यदि कोई क्रमपरिवर्तन उत्पन्न करने के लिए इसका उपयोग शुरू करने से पहले जनरेटर का कई बार अभ्यास करता है, तो यह अधिक क्रमपरिवर्तन उत्पन्न कर सकता है, लेकिन यह यादृच्छिकता बढ़ाने का एक बहुत ही अक्षम तरीका हैः मान लीजिए कि कोई जनरेटर का उपयोग करने के लिए एक अरब तक की यादृच्छिक संख्या की व्यवस्था कर सकता है, सरलता के लिए 230 कहें, आरंभीकरण और क्रमपरिवर्तन उत्पन्न करने के बीच का समय, तो संभावित क्रमपरिवर्तन की संख्या अभी भी केवल 262 है। एक और समस्या तब होती है जब एक सरल रैखिक सर्वांगसम पी. आर. एन. जी. का उपयोग ऊपर वर्णित सीमा में कमी की विभाजन-और-ग्रहण-शेष विधि के साथ किया जाता है। यहाँ समस्या यह है कि मॉड्यूलो 2ई के साथ एक रैखिक सर्वांगसम पी. आर. एन. जी. के निम्न-क्रम वाले बिट्स उच्च-क्रम वाले बिट्स की तुलना में कम यादृच्छिक होते हैंः जनरेटर के निम्न एन बिट्स की अवधि अधिकतम 2एन होती है। जब भाजक दो की शक्ति है, तो शेष को लेने का अनिवार्य रूप से मतलब उच्च-क्रम के बिट्स को फेंकना है, जैसे कि एक काफी कम यादृच्छिक मूल्य के साथ समाप्त होता है। यदि एल. सी. जी. में प्राइम मॉड्यूलो है तो अलग-अलग नियम लागू होते हैं, लेकिन ऐसे जनरेटर असामान्य हैं। यह सामान्य नियम का एक उदाहरण है कि एक खराब गुणवत्ता वाला आर. एन. जी. या पी. आर. एन. जी. खराब गुणवत्ता वाले फेरबदल का उत्पादन करेगा। आर. सी. 4 भी देखें, जो एक सरणी जलाशय के नमूने को बदलने पर आधारित एक धारा साइफर है, विशेष रूप से एल्गोरिदम आर जो फिशर-येट्स शफल संदर्भों का एक विशेषज्ञता है बाहरी लिंक एक संवादात्मक उदाहरण संयोजन एल्गोरिदम यादृच्छिक एल्गोरिदम क्रमपरिवर्तन मोंटे कार्लो विधियाँ उदाहरण के साथ छद्म कोड लेख उदाहरण के साथ पायथन (प्रोग्रामिंग भाषा) कोड