2012-04-11 11 views
5

बनाने के बिना यादृच्छिक मान प्राप्त करें मैं एक दशमलव क्षेत्र के साथ एक वर्ग कन्स्ट्रक्टर लिख रहा हूं, जिसे यादृच्छिक मान से प्रारंभ करने की आवश्यकता है। बस एक छोटा सा क्षेत्र और मुझे नई Random ऑब्जेक्ट बनाने की आवश्यकता है। पहली जगह में यह बोझिल लग रहा है, और दूसरी तरफ एक ही टुकड़ा में बहुत सारी वस्तुओं को बनाने के मामले में बहुत सारे बराबर मूल्य उत्पन्न हो सकते हैं (new Random()new Random(System.currentTimeMillis()) पर euqal है, और बराबर समय मिलिस समान यादृच्छिक मानों को लागू करता है)।`रैंडम` ऑब्जेक्ट

इससे बचने का सबसे अच्छा तरीका क्या है?

+0

मैं 'डेटाग्राम सॉकेट() 'में समाधान ढूंढने की कोशिश करता हूं (इसे यादृच्छिक सॉकेट मान में चाहिए), लेकिन सफल नहीं हुआ था। – Jofsey

+1

जावा का कौन सा संस्करण आप उपयोग कर रहे हैं? –

+0

मैं जावा 7 का उपयोग कर रहा हूं। – Jofsey

उत्तर

9

नई यादृच्छिक() नई यादृच्छिक के लिए (System.currentTimeMillis())

नहीं, यह नहीं है euqal है। हाल ही में जेडीके में, यह new Random(seedUniquifier()^System.nanoTime()); है जहां seedUniquifier() एक स्थिर AtomicLong पर एक रैखिक संगत जनरेटर चलाने पर आधारित है। तो यह आवश्यक रूप से Random वस्तुओं को बनाने के लिए वास्तव में सुरक्षित है।

बेशक, आप हमेशा private static Random फ़ील्ड कर सकते हैं और इसे कन्स्ट्रक्टर में उपयोग कर सकते हैं।

6

आप Math.random के लिए देख रहे हैं। यह एक स्थैतिक विधि है जो पहली बार एक नई Random ऑब्जेक्ट को पहली बार बुलाती है, और उसके बाद उस ऑब्जेक्ट का उपयोग करती है। तो आपको Random ऑब्जेक्ट स्वयं को प्रबंधित किए बिना, सभी स्थिर फ़ील्ड प्रारंभिकताओं के बीच एक एकल Random ऑब्जेक्ट साझा करने के लाभ प्राप्त होते हैं।

+1

हालांकि यह एपीआई को 'यादृच्छिक 'के रूप में सुखद नहीं होने का नुकसान है। एक स्थिर स्थिर क्षेत्र में शामिल "प्रबंधन" में बहुत कुछ नहीं है ... –

+0

पूर्णांक के लिए समान विधि होना बहुत अच्छा होगा। तब तक, मैं अपनी खुद की कक्षा में ** स्थिर ** 'यादृच्छिक' फ़ील्ड का उपयोग करना पसंद करता हूं। – Jofsey

2

आप जावा 7 का उपयोग कर रहे हैं, के रूप में दस्तावेज Random, threadsafe है:

java.util.Random के उदाहरण threadsafe हैं। हालांकि, एक ही java.util.Random उदाहरण के समवर्ती उपयोग थ्रेड में विवाद और परिणामस्वरूप खराब प्रदर्शन का सामना कर सकते हैं। Multithreaded डिजाइन में ThreadLocalRandom का उपयोग करने के बजाय विचार करें।

तो तुम बस का उपयोग कर सकते हैं:

private static final Random random = new Random(); 

... या ThreadLocalRandom उपयोग करें यदि आप कई धागे से इस का उपयोग किया जा रहे हैं। यह अभी भी SecureRandom के रूप में यादृच्छिक होने वाला नहीं है। मूल रूप से अपनी आवश्यकताओं के अनुसार अपनी पसंद को समायोजित करें।

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