2012-09-21 9 views
11

मैं एक ऐप बना रहा हूं और इसके लिए मेरे पास टेस्ट डेटा भरने के लिए एक फ़ंक्शन है। लघु रूपरेखा:जावा यादृच्छिक हमेशा लंबे समय तक नकारात्मक प्रवृत्ति प्रदान कर रहा है?

 HashMap<String, Long> iIDs = new HashMap<String, Long>(); 
     HashMap<String, Integer> vals = new HashMap<String, Integer>(); 

     long iID1 = addIndicator("I1", "i1", Color.RED); 
     long iID2 = addIndicator("I2", "i2", Color.BLUE); 
     long iID3 = addIndicator("I3", "i3", Color.GREEN); 
     long iID4 = addIndicator("I4", "i4", Color.MAGENTA); 

     iIDs.put("iID1", iID1); 
     iIDs.put("iID2", iID2); 
     iIDs.put("iID3", iID3); 
     iIDs.put("iID4", iID4); 

     int v1 = 80; 
     int v2 = 30; 
     int v3 = 25; 
     int v4 = 40; 

     vals.put("v1", v1); 
     vals.put("v2", v2); 
     vals.put("v3", v3); 
     vals.put("v4", v4); 

     int numDays = 500; 
     int dateDistance = 14; 

     Calendar c = Calendar.getInstance(); 

     for(int i=0;i<numDays;i++) 
     { 
      c.add(Calendar.DATE, dateDistance); 
      for(int j=1;j<5;j++) 
      { 
       int currVal = vals.get("v"+j); 
       int rand = new Random().nextInt(6); 
       int newVal; 

       if(rand <= 2) // 0, 1, 2 
        newVal = currVal + rand; 
       else   // 3, 4, 5 
        newVal = currVal - rand; 

       pseudo: addPointForIndicator(); 
       vals.put("v"+j, newVal); 
      } 
     } 

कोई फर्क नहीं पड़ता कि मैं परीक्षण डेटा कितनी बार बनाने के लिए, चित्र हमेशा इस तरह दिखता है: Graph

तो यादृच्छिक संख्या की प्रवृत्ति हमेशा नकारात्मक है। ऐसा क्यों है?

+2

आप प्रत्येक लूप पुनरावृत्ति में एक नई 'यादृच्छिक' वस्तु क्यों बनाते हैं? – Baz

+1

यह नहीं कि यह आपके परिणामों को जरूरी बताता है, लेकिन आपका 'रैंडम' का उपयोग गलत है। आपको एक ही इंस्टेंस को सभी कॉलों में साझा करना होगा, अन्यथा आपको छद्म यादृच्छिक ** अनुक्रम ** नहीं मिल रहा है। –

+0

सभी यादृच्छिक संख्याओं के उत्पादन के लिए 'java.util.Random' के समान उदाहरण का उपयोग करें। यह यादृच्छिकता सच्चे छद्म-यादृच्छिकरण बनाकर "यादृच्छिकरण बढ़ाएगा"। – Vulcan

उत्तर

6

यह आपके तर्क से काफी स्पष्ट है कि इसे नकारात्मक रुझान बनाना चाहिए, यहां तक ​​कि इस तथ्य को अनदेखा करना कि Random का उपयोग अनुबंध का पालन नहीं करता है। आप समय के आधे [0,2] रेंज में एक संख्या जोड़ते हैं और समय के दूसरे भाग [3,5] श्रेणी में एक संख्या घटाते हैं। कोड, ठीक करने के लिए आसान है, हालांकि:

if(rand <= 2) // 0, 1, 2 
    newVal = currVal + rand; 
else   // 3, 4, 5 
    newVal = currVal - rand + 3; 

और एक क्लीनर ठीक

newVal = currVal + random.nextInt(7)-3; 

इस अतिरिक्त लाभ यह है कि यह मूल्य कभी कभी अपरिवर्तित रहने की अनुमति देता है, जो मेरा मानना ​​है कि एक होना चाहिए है किया जाएगा अपने डेटा को अनुकरण करने के लिए और अधिक उचित तरीका।

+0

लॉल ... आप सही हैं ... :) आह, तर्क, मेरा दुश्मन ... धन्यवाद! मैं आपकी पोस्ट को 5 मिनट –

+2

@downvoter में उत्तर के रूप में चिह्नित करूंगा क्यों पृथ्वी पर आप इस पूरी तरह से अच्छे, स्वीकार्य उत्तर को कम कर देंगे? यह निश्चित रूप से बर्बरता के अलावा कुछ भी नहीं है, और सबसे दुखद प्रकार - आपकी गुमनामता के पीछे छिपा हुआ है। –

0

मुझे नहीं पता कि आपका उद्देश्य क्या है, लेकिन कम बाध्य करने का प्रयास करें।

2+random.nextInt() 

जहां आपका यादृच्छिक वर्ग उदाहरण यादृच्छिक है। और जैसा कि अन्य लोगों ने कहा, उसी उदाहरण का उपयोग करें, आप इस तरह एक "सही" अनुक्रम उत्पन्न नहीं कर सकते हैं।

2

मैं तुम क्या करने की कोशिश कर रहे हैं नहीं यकीन है कि क्या है, लेकिन निम्नलिखित ब्लॉक कोई नकारात्मक रुझान

if(rand <= 2) // 0, 1, 2 
    newVal = currVal + rand; 
else   // 3, 4, 5 
    newVal = currVal - rand; 

आप कम संख्या को जोड़ने और बड़ों को घटाकर कर रहे हैं निर्माण करने के लिए प्रतीत होता है हूँ।

+0

दाएं, मार्को टॉपोलनिक ने मुझे इस पर लाया ... कभी-कभी सबसे स्पष्ट देखना सबसे मुश्किल है: पी –

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