2012-06-28 9 views
11
scala> Random.shuffle((1 to 10).toSet) 
res10: scala.collection.immutable.Set[Int] = Set(5, 10, 1, 6, 9, 2, 7, 3, 8, 4) 

scala> Random.shuffle((1 to 10).toSet) 
res11: scala.collection.immutable.Set[Int] = Set(5, 10, 1, 6, 9, 2, 7, 3, 8, 4) 

scala> Random.shuffle((1 to 10).toSet) 
res12: scala.collection.immutable.Set[Int] = Set(5, 10, 1, 6, 9, 2, 7, 3, 8, 4) 

scala> Random.shuffle((1 to 10).toList) 
res13: List[Int] = List(3, 9, 8, 5, 7, 6, 10, 2, 1, 4) 

scala> Random.shuffle((1 to 10).toList) 
res14: List[Int] = List(5, 10, 2, 9, 4, 7, 8, 6, 1, 3) 

scala> Random.shuffle((1 to 10).toList) 
res15: List[Int] = List(5, 9, 10, 6, 8, 3, 4, 1, 7, 2) 

तो शफ़ल सूचियों को ठीक से संभाल सकता है, लेकिन सेट नहीं करता है? सेट नहीं किया जा सकता है? res10 == res11 == res12 क्यों है?scala.util का उपयोग कर सेट बनाम सूची पर शफल का व्यवहार। यादृच्छिक

+0

आपकी शिकायत यादृच्छिक व्यवहार के बजाय, बल्कि सेट के व्यवहार के बारे में नहीं है। सेट अनुबंध ऑर्डर के संरक्षण को इंगित नहीं करता है - आसानी से ऑप्टिमाइज़ेशन के लिए अनुमति देता है जैसे कि हैशटेबल के साथ सेट का बैक अप लेना - इस प्रकार कॉल करना टूसेट आपके संग्रह को फिर से ऑर्डर करने का निमंत्रण है। –

उत्तर

20

स्कैला के सेट का आदेश नहीं दिया जाता है (बस गणितीय लोगों की तरह)। वे iterable कर रहे हैं। हालांकि-तुम सिर्फ आदेश है कि आप में आइटम मिल जाएगा पर भरोसा नहीं कर सकते हैं, सेट के कई प्रयोगों उसी क्रम-यानी में एक ही तत्व पुनरावृति जाएगा,

scala> Set(1, 2, 3, 4, 5).toList == Set(5, 4, 3, 2, 1).toList 
res0: Boolean = true 

कौन सा बताते हैं प्रभाव आप यहां देख रहे हैं। आपको इस पर भरोसा नहीं करना चाहिए, यद्यपि उपरोक्त मान्य Set कार्यान्वयन हो सकता है जिसके लिए उपर्युक्त नहीं होगा।

+1

उह ... ठीक है। मैं आपकी व्याख्या स्वीकार करता हूं, हालांकि मुझे नहीं लगता कि रैंडम। शफल यहां पोस्टकंडिशन पूरा कर रहा है। अंतर्निहित कंटेनर के बावजूद शफल एल्गोरिदम को यादृच्छिक क्रम प्रदान करना होगा। इस व्यवहार को प्रदान करना बहुत आसान है। उदाहरण के लिए: Random.shuffle ((1 से 10) .toSet) आंतरिक रूप से Random.shuffle ((1 से 10) .toSet.toList) को मनमाने ढंग से ऑर्डर करने के लिए आंतरिक रूप से कॉल कर सकता है, जिसे तब शफ़ल किया जा सकता है। –

+7

यह थोड़ा अजीब है, और मुझे यकीन नहीं है कि 'shuffle' को किसी भी' ट्रैवर्सबलऑन '(' Seq' कहने के बजाय) के लिए क्यों परिभाषित किया गया है। सेट के लिए 'shuffle' का एक संस्करण लिखना संभव नहीं है जो एक यादृच्छिक क्रम प्रदान करेगा, क्योंकि सेट के लिए _any_ प्रकार के आदेश के बारे में बात करना समझ में नहीं आता है। –

+2

बस अपनी टिप्पणी संपादित करें: हाँ, लेकिन 'shuffle' उसी इनपुट का एक संग्रह देता है जो इसके इनपुट के रूप में होता है, और जैसे ही आप शफ़ल सूची को एक सेट में वापस डाल देते हैं, आप उसी स्थिति में फंस जाते हैं। –

1

यादृच्छिक सेट "शफल" है; सेट के पास ऑर्डर नहीं होने के बाद इसका कोई प्रभाव नहीं पड़ता है। आरपीएल प्रत्येक बार शफ़ल सेट को उसी तरह मुद्रित करता है:

scala> Set(1,2,3,4,5) 
res29: scala.collection.immutable.Set[Int] = Set(5, 1, 2, 3, 4) 

scala> Set(5,4,3,2,1) 
res30: scala.collection.immutable.Set[Int] = Set(5, 1, 2, 3, 4) 

scala> util.Random.shuffle(res30) 
res31: scala.collection.immutable.Set[Int] = Set(5, 1, 2, 3, 4) 
+1

हां, यह वही बात है जो मौजूदा उत्तर के रूप में तीन साल पहले –

+0

से असहमत है। मेरा जवाब वही नहीं है और शुरुआत के लिए समझने के लिए स्पष्ट और आसान है। मैं @kr की राय सुनना चाहूंगा जिस पर उत्तर अधिक स्पष्ट है। उनकी टिप्पणी इंगित करती है कि दूसरा जवाब नहीं था। – retrospectacus

+0

चूंकि @kr "21 अगस्त को 13:13 को अंतिम बार देखा गया" 13:13 "आपको यह प्राप्त करने की संभावना नहीं है। और चूंकि उसने इसे स्वीकार कर लिया, मुझे लगता है कि उसने टिप्पणियों के बाद इसे स्पष्ट कर लिया। –

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