2011-10-26 12 views
17

मैं जावा में यादृच्छिक संख्याएं उत्पन्न करना चाहता हूं, मुझे पता है कि मुझे Math.random() जैसे मौजूदा तरीकों का उपयोग करना चाहिए, हालांकि, मेरा प्रश्न है: मैं संख्याओं का एक ही अनुक्रम कैसे उत्पन्न कर सकता हूं, हर बार जब मैं अपना आवेदन चलाता हूं? उदाहरण: उत्पन्न अनुक्रम है: 0.9, 0.08,0.6 तो मैं चाहता हूँ कि इस अनुक्रम हर बार जब मैं इस विधि पर अमल उत्पन्न हो जाएगा ..यादृच्छिक संख्याओं के समान अनुक्रम का जनरेशन

उत्तर

29

ज़रूर - बस बजाय Math.random() का उपयोग करने का Random का एक उदाहरण बनाने के लिए, और हमेशा एक ही बीज निर्दिष्ट करें:

Random random = new Random(10000); // Or whatever seed - maybe configurable 
int diceRoll = random.nextInt(6) + 1; // etc 

ध्यान दें कि यदि आपके एप्लिकेशन में एकाधिक धागे शामिल हैं, तो यह कठिन हो जाता है, क्योंकि समय कम अनुमानित हो जाता है।

यह Random का लाभ लेता जा रहा है एक pseudo-random number generator - दूसरे शब्दों में, हर बार जब आप इसे एक नए परिणाम के लिए पूछना है, यह आंतरिक स्थिति manipulates आप एक यादृच्छिक दिखने अनुक्रम देने के लिए है, लेकिन मौजूदा आंतरिक बीज जानते हुए भी (या वास्तव में राज्य) यह पूरी तरह से अनुमानित है।

+2

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

6

आपको यादृच्छिक संख्या जनरेटर को बीज करने की आवश्यकता है।

Random random = new Random(aFixedNumber); 
random.nextInt(); // will always be the same 
24

बार-बार उसी बीज का उपयोग करने का एक उदाहरण।

public static void main(String... args) throws IOException { 
    printDoublesForSeed(1); 
    printDoublesForSeed(128); 
    printDoublesForSeed(1); 
    printDoublesForSeed(128); 
} 

private static void printDoublesForSeed(long seed) { 
    double[] doubles = new double[10]; 
    Random rand = new Random(seed); 
    for (int j = 0; j < doubles.length; j++) { 
     doubles[j] = (long) (rand.nextDouble() * 100)/100.0; 
    } 
    System.out.println("doubles with seed " + seed + " " + Arrays.toString(doubles)); 
} 

प्रिंट

doubles with seed 1 [0.73, 0.41, 0.2, 0.33, 0.96, 0.0, 0.96, 0.93, 0.94, 0.93] 
doubles with seed 128 [0.74, 0.53, 0.63, 0.41, 0.21, 0.2, 0.33, 0.74, 0.17, 0.47] 
doubles with seed 1 [0.73, 0.41, 0.2, 0.33, 0.96, 0.0, 0.96, 0.93, 0.94, 0.93] 
doubles with seed 128 [0.74, 0.53, 0.63, 0.41, 0.21, 0.2, 0.33, 0.74, 0.17, 0.47] 

संपादित करें यादृच्छिक बीज का एक दिलचस्प दुरुपयोग।

public static void main(String ... args) { 
    System.out.println(randomString(-6225973)+' '+randomString(1598025)); 
} 

public static String randomString(int seed) { 
    Random rand = new Random(seed); 
    StringBuilder sb = new StringBuilder(); 
    for(int i=0;i<5;i++) 
     sb.append((char) ('a' + rand.nextInt(26))); 
    return sb.toString(); 
} 

प्रिंट

hello world 
+2

+1। – mre

+2

मुझे हैलो वर्ल्ड उदाहरण पसंद है। मुझे लगता है कि कोई बेहतर समाधान नहीं है जो सभी संभावित बीजों को सही लोगों को खोजने के लिए मजबूर करता है? संपादित करें: दोहा जाहिर है, मुझे अपनी पहली कॉफी प्राप्त करने से पहले चीजें नहीं लिखनी चाहिए: o – Voo

+0

मैंने अभी ब्रूट फोर्स का उपयोग किया था। ;) –

4

Math.random सिर्फ वर्ग java.util.Random का एक आवरण है। पहली बार जब आप Math.random पर कॉल करते हैं तो कक्षा java.util.Random का एक उदाहरण बनाया गया है।

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

डिफ़ॉल्ट रूप से, java.util.Random 1 जनवरी 1 9 70 से बीज के रूप में मिलीसेकंड का उपयोग करता है। इसलिए, हर बार जब आप अपना प्रोग्राम शुरू करते हैं, तो यह अलग-अलग संख्याओं का उत्पादन करेगा (जब तक कि आप इसे 1 मिलीसेकंड के तहत जावा शुरू करने के लिए प्रबंधित न करें)। ,

import java.util.Random; 

class ... { 
    Random randomNumberGenerator = new Random(199711); 

    public void ...() 
    { 
     int randomInt = randomNumberGenerator.nextInt(); 
     double randomDouble = randomNumberGenerator.nextDouble(); 
    } 
} 

randomNumberGenerator हमेशा नंबर की उसी क्रम थूक से बाहर होगा जब तक आप बीज परिवर्तन नहीं करते के रूप में (: तो, आपकी समस्या का हल खुद के द्वारा अपने स्वयं के java.util.Random उदाहरण बना सकते हैं और यह बीज के लिए है 199711)।

0

मैं ऐप में संख्याओं को हार्डकोड करता हूं। यह अधिक स्मृति लेता है लेकिन बहुत तेज़ है।

बस टर्मिनल पर यादृच्छिक संख्या प्रिंट करें, फिर उन्हें अपने कोड पर कॉपी-पेस्ट करें।

आपके द्वारा किए गए कार्यों को समझाते हुए एक टिप्पणी छोड़ना सुनिश्चित करें, या वे अनजान पाठक के लिए काले जादू की तरह दिखेगा।

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

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