2012-09-17 15 views
36

यह मेरा कोड एक तर्क के रूप में एक बीज का उपयोग करने यादृच्छिक संख्या उत्पन्न करने के लिए है।जावा रैंडम नंबर एक बीज का उपयोग

double randomGenerator(long seed) { 
    Random generator = new Random(seed); 
    double num = generator.nextDouble() * (0.5); 

    return num; 
} 

हर मैं एक बीज देने के लिए और 100 नंबर जेनरेट करने का प्रयास करें, वे सब एक ही हैं।
कृपया मदद करें।

+3

है यही कारण है कि एक बीज ऐसा करने के लिए माना जाता है। आप केवल बीज के लिए एक नंबर उत्पन्न कर रहे हैं। आप क्या हासिल करने का प्रयास कर रहे हैं? –

+0

संभावित डुप्लिकेट [जावा यादृच्छिक हमेशा बीज सेट करते समय समान संख्या देता है?] (Http://stackoverflow.com/questions/5533191/java-random-always-returns-the-same-number-when-i- सेट-द-बीड) – finnw

+2

आप यादृच्छिक परिणामों के उत्पादन के लिए 'System.currentTimeMillis() 'बीज के रूप में उपयोग कर सकते हैं। किसी भी बीज को न देने से यादृच्छिक परिणाम भी मिलते हैं। मुझे यकीन नहीं है कि अगर आप किसी भी बीज नहीं देते हैं तो यह किसी बिंदु पर दोहराना शुरू कर देगा। – WVrock

उत्तर

60

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

इस छद्म यादृच्छिक पीढ़ी और बीज को समझने के लिए चेक: http://en.wikipedia.org/wiki/Pseudorandom_number_generator

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

आप विभिन्न दृश्यों करना चाहते हैं (सामान्य मामला है जब ट्यूनिंग नहीं या एल्गोरिथ्म डिबगिंग), आप शून्य आर्ग निर्माता जो एक अलग बीज हर बार प्राप्त करने की कोशिश करने के लिए nanoTime का उपयोग करता है फोन करना चाहिए। निश्चित रूप से यह Random उदाहरण अपने विधि के बाहर रखा जाना चाहिए।

आप कोड शायद इस तरह होना चाहिए:

private Random generator = new Random(); 
double randomGenerator() { 
     return generator.nextDouble()*0.5; 
} 
+0

मिलीसेकंड बहुत लंबा समय है, यह सिस्टम से अधिक सुरक्षित ट्यू का उपयोग करेगा। नैनोटाइम() – kukis

+0

@ कुकिइस इससे कोई फर्क नहीं पड़ता। यह सिर्फ एक संख्या है जो हर ** कार्यक्रम ** लॉन्च पर समान नहीं है। क्योंकि आपका प्रोग्राम केवल एक बार बीज सेट करता है। –

+1

"नया रैंडम()" का उपयोग कर समकक्ष या बेहतर स्रोत देखें: सार्वजनिक रैंडम() { यह (बीज यूनिकिफायर()^System.nanoTime()); } – dermoritz

6

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

2

समस्या यह है कि आप यादृच्छिक जनरेटर फिर बीज है। हर बार जब आप इसे याद करते हैं तो यादृच्छिक संख्या जनरेटर की प्रारंभिक स्थिति रीसेट हो जाती है और आपके द्वारा उत्पन्न पहली यादृच्छिक संख्या प्रारंभिक स्थिति

6

आप विधि दायरे में एक नया रैंडम बनाने नहीं किया जाना चाहिए। इसे कक्षा सदस्य बनाएं:

public class Foo { 
    private Random random 

    public Foo() { 
     this(System.currentTimeMillis()); 
    } 

    public Foo(long seed) { 
     this.random = new Random(seed); 
    } 

    public synchronized double getNext() { 
     return generator.nextDouble(); 
    } 
} 

यह केवल एक उदाहरण है। मुझे नहीं लगता कि इस तरह से लपेटकर Random किसी भी मूल्य कहते हैं। इसे अपने एक वर्ग में रखो जो इसका उपयोग कर रहा है।

+0

मैंने इसे अपनी मुख्य कक्षा में रखा और इसे वहां से बुलाया। – WVrock

+0

यह उत्तर लगभग प्रश्न से पूरी तरह से असंबंधित है। –

+3

यह असंबंधित प्रतीत हो सकता है क्योंकि यह केवल एक रिफैक्टर लगता है, लेकिन यह निश्चित रूप से संबंधित है। ओपी हर बार विधि कहलाते समय यादृच्छिक जनरेटर को फिर से चालू कर रहा था, इसलिए 'अगली डबल' हमेशा यादृच्छिक अनुक्रम में _first_ डबल लौटाएगी। यह उत्तर केवल एक बार यादृच्छिक जनरेटर को तुरंत चालू करता है, और प्रत्येक बार 'getNext' कहा जाता है, यह वास्तव में यादृच्छिक अनुक्रम के माध्यम से कदम उठाता है और प्रत्येक बार एक अलग संख्या देता है। –

2

आप एक बीज का उपयोग कर आप कुछ इस तरह कर सकते हैं एकाधिक संख्याओं उत्पन्न करना चाहते हैं, तो:

public double[] GenerateNumbers(long seed, int amount) { 
    double[] randomList = new double[amount]; 
    for (int i=0;i<amount;i++) { 
     Random generator = new Random(seed); 
     randomList[i] = Math.abs((double) (generator.nextLong() % 0.001) * 10000); 
     seed--; 
    } 
    return randomList; 
} 

यदि आप एक ही बीज का उपयोग यह वही सूची प्रदर्शित करेगा।

Random rand = new Random(System.currentTimeMillis()); 

यह सबसे अच्छा तरीका है Random संख्या उत्पन्न करने के लिए है:

14

आसान तरीका उपयोग करने के लिए है।

0

उदाहरण के कई यहाँ एक नया Random उदाहरण बनाने, लेकिन यह अनावश्यक है।एक समाधान के रूप में synchronized का उपयोग करने का कोई कारण नहीं है। इसके बजाय, ThreadLocalRandom वर्ग पर तरीकों का लाभ लें:

double randomGenerator() { 
    return ThreadLocalRandom.current().nextDouble(0.5); 
} 
संबंधित मुद्दे