यादृच्छिक शफल सूची सूची बॉक्स आइटम सी #

मैं सूची में वर्तमान आइटम को यादृच्छिक रूप से कैसे बदल सकता हूं?

मेरे पास यह कोड है, लेकिन यह बहुत धीमी और अक्षम है -

private void shuffleItemsToolStripMenuItem_Click(object sender, EventArgs e)
{
   ListBox.ObjectCollection list = listBox1.Items;
   Random rng = new Random();
   int n = list.Count;
   while ( n > 1 )
   {
      n--;
      int k = rng.Next(n + 1);
      string value = (string)list[k];
      list[k] = list[n];
      list[n] = value;
   }
}

हालांकि यह कोड तकनीकी रूप से काम करता है, यह बहुत धीमा है और कई बदलाव नहीं देता है, अक्सर वही कुछ शफल देता है।

मैं पिछले घंटे के लिए Google पर खोज कर रहा हूं और इसका समाधान ढूंढने में असमर्थ रहा हूं। मैं खींचने के लिए बाल से बाहर भाग रहा हूँ।

धन्यवाद।

0
इस पोस्ट पर कुछ जवाब हैं जो आपकी मदद करेंगे। एक आपको फिशर-येट्स शफल एल्गोरिदम की ओर ले जाता है।
जोड़ा लेखक Mike Perrenoud, स्रोत
मैं नहीं देख सकता कि मैं फिशर-येट्स एल्गोरिदम को सूची बॉक्स में कैसे अनुकूलित कर सकता हूं। मुझे इसके साथ बहुत मदद चाहिए।
जोड़ा लेखक John, स्रोत
11+ वस्तुओं की एक सूची। सूची को दो बार शफ़ल करना उसी क्रम के साथ समान 2 या तीन सूची उत्पन्न करता है। मुझे कोड की आवश्यकता है जो इसे यादृच्छिक रूप से और विशिष्ट रूप से shuffles, और 2 + सेकंड नहीं लेता है।
जोड़ा लेखक John, स्रोत
मुझे यकीन है कि इसमें 2 सेकंड लग रहे हैं, कुछ मिलीसेकंड दें या लें। यह बिल्कुल अत्याचारी है।
जोड़ा लेखक John, स्रोत
निष्पादन योग्य से। ये धीमा है। मैंने एक नई विधि फिर से लिखी है। पूरी सहायताके लिए शुक्रिया। [/ व्यंग्य]
जोड़ा लेखक John, स्रोत
@ स्मिथ मैं संभवतः इस एल्गोरिदम को 11 आइटम सूची को सॉर्ट करने के लिए कई सेकंड लेने की कल्पना नहीं कर सकता। कहीं भी इसके पास कहीं भी नहीं। यदि यह आपकी समस्या है, तो यह शफल से संबंधित नहीं है। यह वास्तविक शफलिंग से संबंधित कुछ के कारण होना चाहिए। अलग-अलग शफल होने के लिए, यह संभव है कि आप रैंडम उदाहरणों को एक करीबी पर्याप्त समय के भीतर बना रहे हों कि उन्हें एक ही बीज मिल जाए; यदि नहीं, तो आपके पास पर्याप्त पर्याप्त अनुक्रम और पर्याप्त पुनरावृत्तियों होना चाहिए कि टकराव की बाधा वास्तव में काफी अधिक है। ध्यान दें कि "जन्मदिन विरोधाभास" उस संबंध में काम पर है।
जोड़ा लेखक Servy, स्रोत
इस कोड को निश्चित रूप से 10 बार shuffled 11 आइटम की सूची के लिए चलाने के लिए 2 सेकंड नहीं लेना चाहिए। क्या आप वाकई उस संख्या में संकलन समय शामिल नहीं कर रहे हैं? इसके अलावा इसे प्रत्येक बार विशिष्ट रूप से शफल किया जाना चाहिए क्योंकि नया रैंडम() वर्तमान समय को बीज के रूप में उपयोग करता है। अगर आपको भरोसा नहीं है कि आप इसे हमेशा rng = new random (currentTime) कर सकते हैं।
जोड़ा लेखक Steven, स्रोत
यह निष्पादन योग्य से चलाया जा रहा है या आप हर बार recompiling कर रहे हैं?
जोड़ा लेखक Steven, स्रोत
मैंने आपके द्वारा पोस्ट किए गए कोड का उपयोग किया है, आप जिस सूची में शफल हो रहे हैं और आप क्यों सोचते हैं कि यह कई बदलाव नहीं देता है?
जोड़ा लेखक TimS, स्रोत

2 उत्तर

फिशर-येट्स शफल का प्रयास करें: http://en.wikipedia.org/wiki/ फिशर% E2% 80% 93Yates_shuffle

0
जोड़ा

मुझे लगता है कि आप winforms का उपयोग कर रहे हैं, एक ListBox में विधियों की एक जोड़ी है BeginUpdate और EndUpdate को अद्यतन करने के लिए उपयोग किया जाता है वस्तुओं को तेजी से (पुनर्निर्मित करने की कोई ज़रूरत नहीं है), वस्तुओं को बदलने पर पुनर्भुगतान सब कुछ धीमा करने का कारण है। यह भी ध्यान रखें कि आपको यहां किसी भी कलाकार की आवश्यकता नहीं है, यह आपके कोड को थोड़ा धीमा कर सकता है, निम्न का प्रयास करें:

private void shuffleItemsToolStripMenuItem_Click(object sender, EventArgs e) {
   ListBox.ObjectCollection list = listBox1.Items;       
   Random rng = new Random();
   int n = list.Count;
   //begin updating
   listBox1.BeginUpdate();
   while ( n > 1 ) {
    n--;
    int k = rng.Next(n + 1);
    object value = list[k];
    list[k] = list[n];
    list[n] = value;
   }
   listBox1.EndUpdate();
   listBox1.Invalidate();
}

हालांकि मैं सहमत हूं कि ऊपर कुछ बदलावों का उपयोग किए बिना भी, आपका कोड धीरे-धीरे नहीं चलना चाहिए।

0
जोड़ा