2014-12-19 10 views
5

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

+3

"अपने तर्क अगर एकाधिक कॉल के बीच नहीं बदलता है तो इसका परिणाम नहीं बदलेगा। " - क्या आप इसका एक उदाहरण दिखा सकते हैं? मुझे पूरा यकीन है कि यह सच नहीं है, लेकिन मैं इसका परीक्षण नहीं कर सकता क्योंकि आपका कोड संकलित नहीं होता है। –

+0

@ जोर्ग डब्ल्यू मिट्टाग आपका अधिकार बदल जाएगा परिणाम, ive ने इस वाक्य को हटा दिया। यह कोड संदर्भित पारदर्शी नहीं है। यह कोड ईक्लीप्स केप्लर स्काला संस्करण 2.11 –

+0

'त्रुटि का उपयोग कर वर्कशीट में मेरे लिए संकलित करता है: नहीं मिला: मान genRandomInt'। यह स्कैला MATLAB बाध्यकारी से एक विधि प्रतीत होता है? लेकिन मेरे पास MATLAB नहीं है। –

उत्तर

8

नहीं, क्योंकि यह वास्तव में राज्य को संशोधित करता है। new scala.util.Random अंततः new java.util.Random का आह्वान करता है, जो स्थिर (यानी वैश्विक) को एक्सेस और संशोधित करता है, AtomicLong को seedUniquifier कहा जाता है। और इसलिए यदि इस विधि को कई बार कहा जाता है तो परिणाम बदल जाएगा।

यह एक अच्छा उदाहरण है कि कैसे निर्दोष दिखने वाले तरीके वैश्विक परिवर्तनीय स्थिति तक पहुंच को छुपा सकते हैं, जिसे हास्केल जैसी कठोर कार्यात्मक भाषा में मना किया जाएगा (हालांकि वह दृष्टिकोण अपनी समस्याओं के साथ आता है)।

1

नहीं क्योंकि new scala.util.Random().nextInt ... रिटर्न कुछ अलग हर बार है, जो cogently Imm द्वारा समझाया गया है।

फिर भी आप बस एक बीज में पारित कर सकते हैं तो यह एक शुद्ध समारोह होगा, क्योंकि यह एक ही यादृच्छिक स्ट्रिंग हर बार वापस आ जाएगी। आप बीज को पैरामीटर के रूप में जोड़ सकते हैं या इसे यादृच्छिक स्ट्रिंग विधि के अंदर ठीक कर सकते हैं।

अंत में, मैंने देखा है कि आपने यादृच्छिक स्ट्रिंग उत्पन्न करने के लिए बड़ी संख्या में कोड लिखा है। मेरा सुझाव है कि आप स्कैला चेक देखें, जिसमें यादृच्छिक सामान (यूनिट परीक्षणों के लिए) उत्पन्न करने के लिए उपयोगी कार्यों का ढेर है, String आउट-ऑफ-बॉक्स आता है।

आप एक पुस्तकालय में खींचने के लिए नहीं करना चाहते हैं, तो आप अभी भी उस कोड और अधिक संक्षिप्त कर सकते हैं:

def randomString(fromChars: List[Char], length: Int): String = { 
    val rand = new Random(1234) // Now it's pure functional because the seed is fixed 
    val fromCharsSize = fromChars.size // to save us repeatedly counting 
    List.fill(length)(fromChars(rand.nextInt(fromCharsSize))).mkString 
} 

यह एक ही मान देता है हर बार निरीक्षण करें

scala> randomString("asdf".toList, 10) 
res0: String = dsfafssdsa 

scala> randomString("asdf".toList, 10) 
res1: String = dsfafssdsa 
संबंधित मुद्दे