2010-04-22 20 views
6

यहां आपके लिए एक अजीब सवाल है,क्रमबद्ध सूची को यादृच्छिक कैसे करें?

मेरे पास एक अच्छी तरह से क्रमबद्ध सूची है जिसे मैं यादृच्छिक बनाना चाहता हूं। मुझसे यह कैसे होगा?

मेरे आवेदन में, मेरे पास एक ऐसा फ़ंक्शन है जो एक विघटित वस्तु की रूपरेखा का वर्णन करने वाले बिंदुओं की एक सूची देता है। जिस तरह से समस्या हल हो जाती है, वैसे ही फ़ंक्शन एक अच्छी ऑर्डर सूची देता है। मेरे पास गणित में वर्णित दूसरी सीमा है और यह निर्धारित करना है कि दोनों वस्तुएं एक-दूसरे को अलग करती हैं या नहीं। मैं बस बिंदुओं पर फिर से शुरू करता हूं और यह निर्धारित करता हूं कि कोई भी बिंदु गणितीय सीमा के अंदर है या नहीं।

विधि अच्छी तरह से काम करती है लेकिन मैं बिंदु डेटा को यादृच्छिक बनाकर गति को बढ़ाना चाहता हूं। चूंकि यह संभव है कि मेरी गणितीय सीमा को एक दूसरे के बगल में स्थित बिंदुओं की एक श्रृंखला द्वारा ओवरलैप किया जाएगा, मुझे लगता है कि एक अच्छी तरह से क्रमबद्ध करने के बजाए यादृच्छिक सूची की जांच करना समझदारी होगी (क्योंकि यह केवल एक ही लेता है एक छेड़छाड़ घोषित करने के लिए मारा)।

तो, किसी भी विचार पर मैं आदेशित सूची को यादृच्छिक करने के बारे में कैसे जाऊं?

+0

क्या आप वाकई यादृच्छिकरण पर बिताए गए समय के लायक हैं? यदि नहीं, मापें :) –

उत्तर

12

std::random_shuffle का उपयोग करें। यदि आप स्वयं विधि को कार्यान्वित करना चाहते हैं तो आपको Fisher-Yates shuffle पर देखना चाहिए।

+1

आह धन्यवाद! खुशी है कि मैंने आलसी होने का फैसला किया और पहिया को फिर से शुरू करने का प्रयास करने से पहले सवाल पूछा ... फिर से ... – Faken

+0

मानक random_shuffle बिडरेक्शनल इटरेटर्स पर काम नहीं करता है। – SChepurin

+0

@SChepurin हां, यही कारण है कि मैं स्पष्ट रूप से फिशर येट्स शफल का जिक्र करता हूं। दुर्भाग्यवश अधिकांश यादृच्छिकरण एल्गोरिदम गैर-यादृच्छिक-पहुंच कंटेनर पर असंभव रूप से धीमे हो जाएंगे और संभव नहीं हैं। – pmr

4

आप random_shuffle algorithm को आजमा सकते हैं, लेकिन ध्यान दें कि यह list पर काम नहीं करेगा क्योंकि इसे यादृच्छिक एक्सेस इटरेटर्स की आवश्यकता है। आप इसे vector या deque पर उपयोग कर सकते हैं।

-2
std::random_shuffle(thelist.begin(), thelist.end()); 
1

अपने "सूची" यह मानते हुए एक लिंक्ड सूची मतलब यह नहीं है, लेकिन इसके बजाय कुछ है कि रैंडम एक्सेस का समर्थन करता है (उदाहरण के लिए, एक सरणी, std :: वेक्टर, या std :: Deque), std :: random_shuffle का मतलब उपयोगी हो सकता है।

1

लेकिन एक महत्वपूर्ण सवाल यह होगा कि सूची को यादृच्छिक करने के लिए आवश्यक रनटाइम रनटाइम से अधिक अनुक्रमिक रूप से इसके विपरीत नहीं हो सकता है।

शायद आपको वास्तव में जो करना है वह वास्तव में यादृच्छिक नहीं है, बल्कि इसे आगे के पीछे के अलावा कुछ क्रम में पढ़ें। उदाहरण के लिए, यदि सूची में एन सदस्य हैं, तो शायद आपको 1, एन, 2, एन -1, 3, एन -2, आदि या 1, एन/2, 2, एन/2 + 1, 3, एन को संसाधित करना चाहिए/2 +2, आदि

यदि आपके पास हमेशा अंक की संख्या होती है या यदि अंकों की संख्या एक छोटे से सीमित सेट में आती है, तो आप प्रत्येक संभावित अंक के लिए बिंदु मूल्यांकन का क्रम उत्पन्न कर सकते हैं , या तो वास्तव में यादृच्छिक या शायद किसी तरह से सावधानी से गणना की।

+0

मुझे लगता है कि एक ब्रांड नई यादृच्छिक सूची बनाने का एक अच्छा विचार है। सबसे खराब मामला, मुझे 1 मिलियन बार सूची में फिर से शुरू करने की आवश्यकता होगी। – Faken

1
 
int array[N]; 

for(int i = N - 1; i > 0; i--) { 
    int j = rand() % i; 
    int tmp = array[i]; array[i] = array[j]; array[j] = i; 
} 
संबंधित मुद्दे