2012-04-01 10 views
11

मेरे पास कई अलग-अलग भौतिक सर्वरों में एक बड़ा वितरित कार्यक्रम है, प्रत्येक प्रोग्राम कई धागे पैदा करता है, प्रत्येक धागे कई परिचालनों में एक टुकड़ा खींचने के लिए Math.random() का उपयोग करता है सामान्य संसाधन पूल।विभिन्न jvms या विभिन्न मशीनों में जावा में Math.random() कितना यादृच्छिक है

लक्ष्य सभी परिचालनों में समान रूप से पूल का उपयोग करना है। कभी-कभी, यह संसाधन पूल पर एक स्नैपशॉट देखकर इतना यादृच्छिक दिखाई नहीं देता है कि यह देखने के लिए कि कौन सा टुकड़ा उस समय हो रहा है (यह वास्तव में हो सकता है, लेकिन यह मापना और निश्चित रूप से पता लगाना मुश्किल है)।

क्या कुछ ऐसा है जो Math.random() से बेहतर है और उतना ही अच्छा प्रदर्शन करता है (कम से कम बदतर नहीं)?

+0

+1। अगर आपको कोई जवाब मिल जाए तो कृपया मुझे बताएं :) –

+0

कृपया निम्न लिंक पर एक नज़र डालें। http: //www.coderanch।कॉम/टी/510167/जावा/जावा/यादृच्छिक जनरेटर-असफल –

+0

सामान्य संसाधन पूल के लिए कुछ शेड्यूलर का उपयोग क्यों नहीं करें? –

उत्तर

2

Math.random()java.util.Random पर आधारित है, जो linear congruential generator पर आधारित है। इसका मतलब है कि इसकी यादृच्छिकता सही नहीं है, लेकिन अधिकांश कार्यों के लिए पर्याप्त है, और ऐसा लगता है कि यह आपके कार्य के लिए पर्याप्त होना चाहिए।

हालांकि, ऐसा लगता है कि आप doubleMath.random() के वापसी मूल्य का चयन कर रहे हैं ताकि विकल्पों की एक निश्चित संख्या के बीच चयन किया जा सके, जो यादृच्छिकता की गुणवत्ता को और खराब कर सकता है। java.util.Random.nextInt() का उपयोग करना बेहतर होगा - बस उसी Random ऑब्जेक्ट का पुन: उपयोग करना सुनिश्चित करें।

कभी कभी, यह एक संसाधन पूल पर एक स्नैपशॉट को देखकर तो यादृच्छिक प्रकट नहीं होता है सही अनियमितता में पैटर्न खोलना पर जो टुकड़े यह उस पल में हो रही है

हमारे दिमाग वास्तव में अच्छा कर रहे हैं देखने के लिए , तो इसका मतलब लगभग कुछ भी नहीं है। एक अच्छे प्रश्न के लिए

+0

Random.nextInt() पर अच्छा बिंदु, वर्तमान में मैं बस यादृच्छिक डबल को n से गुणा करता हूं और फिर इसे निकटतम पूर्णांक में घुमाता हूं, क्या यह यादृच्छिक()। NextInt() से बहुत अलग है? – user881480

+0

@ user881480: हाँ - यादृच्छिक पूर्णांक उत्पन्न करता है, Math.random() इसे डबल करने के लिए अतिरिक्त काम करता है, केवल आपके लिए इसे एक int में परिवर्तित करने के लिए। यह डबल रूपांतरण यादृच्छिकता की गुणवत्ता को कम कर सकता है (वास्तव में निश्चित नहीं है, लेकिन हो सकता है)। –

0

यह धागा उपयोगी हो सकता है: How good is java.util.Random?

एक और विकल्प:

  • एक यादृच्छिक बीज जब यादृच्छिक उदाहरण
  • init यदि आप लिनक्स उपयोग/dev/urandom
का उपयोग कर उत्पन्न
+0

मैं जावा से बाहरी प्रक्रिया को कॉल नहीं करना चाहता क्योंकि यह प्रदर्शन को कम करता है, मैं प्रति सेकंड 1 ऑपरेशन की गति से चल रहा हूं और सर्वर पर प्रति दिन कई (सैकड़ों हजार या लाख) हैं। – user881480

+0

इसलिए सबसे आसान चीज जो मैं कर सकता हूं वह है कि आप लंबे समय तक (जैसे लिंक में वर्णित) के साथ अपना जनरेटर बनाना चाहते हैं। आपको यह भी याद रखना होगा कि 1,1,1,1,1 प्राप्त करने का मौका 45,1002,783,199,6 – shem

1

Math.Random का एल्गोरिदम किसी भी प्लेटफॉर्म के लिए "यादृच्छिक पर्याप्त" है। Psuedo- यादृच्छिक संख्या बनाने के लिए इस्तेमाल गणितीय मॉडल एक अच्छा है। यह इस बात पर निर्भर करता है कि आप कितने धागे का उपयोग करते हैं। वास्तव में बड़ी संख्या में धागे के लिए, यह आपको वितरण (यादृच्छिक संख्याओं की प्रकृति) भी नहीं देगा, और फिर Math.random() आपको बहुत अधिक उपर देगा।

एक बेहतर विकल्प आज़माएं: संसाधन पूल क्लास बनाएं, जो उन्हें समान रूप से वितरित करता है - और उसके बाद इसे "वितरण" विधि में सुरक्षित अनुभाग में रखें।

+0

जैसा ही यादृच्छिक संख्या आपको वितरण भी नहीं देगा? मेरे मामले में प्रति कार्यक्रम धागे की संख्या कुछ सैकड़ों है, लेकिन प्रत्येक धागा कई संचालन करता है (प्रति सेकंड 1, जहां प्रत्येक ऑपरेशन Math.random()) कहता है। – user881480

+0

संसाधन पूल वर्ग संसाधनों को यादृच्छिक रूप से कैसे वितरित करेगा? क्या इसे Math.random() का उपयोग करना है? – user881480

+0

आपको इसे यादृच्छिक रूप से वितरित करने की आवश्यकता नहीं है, केवल संसाधन नामक एक साधारण श्रेणी बनाएं, एक सिंक्रनाइज़ अगली संसाधन() विधि। इस तरह आप एक-एक करके भी एक-एक वितरण सुनिश्चित करते हुए एक-एक करके जा रहे हैं। इसके अलावा, कुछ बहुत ही विशिष्ट मामलों को छोड़कर सैकड़ों धागे का उपयोग करके बचाए गए समय से अधिक ओवरहेड बनाता है; आपको धागे की मात्रा को सीमित करना चाहिए कि आपका सिस्टम कुशलतापूर्वक उपयोग कर सकता है। – user1304831

0

प्रति javadoc Math.random() java.util.Random का उपयोग करने का एक आसान तरीका है। उसने कहा कि यह सिर्फ एक छद्म यादृच्छिक algorythm है। एक्स/वाई ग्रिड पर यादृच्छिक बिंदुओं को चित्रित करके, वास्तव में एक अलौकिक वास्तविकता की जांच करने का एक आसान तरीका है। आपको कोई पैटर्न नहीं मिलना चाहिए।

असली रैमडोम नंबर प्राप्त करने के लिए आप http://www.random.org जैसी सेवाओं का उपयोग कर सकते हैं। यदि यह धीमा है, तो इसे नियमित रूप से बीज java.util पर कॉल करें। यादृच्छिक आपको वास्तविक यादृच्छिक के करीब ले जा सकता है।

+0

नया java.util.Random() एक संभावित विशिष्ट बीज कैसे प्राप्त करता है? – user881480

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