2012-09-21 6 views
11

Ich baue eine App und dafür habe ich eine Funktion, um sie mit Testdaten zu füllen. Kurzer Abriss:Java-Zufall liefert auf lange Sicht immer einen negativen Trend?

 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); 
      } 
     } 

Egal, wie oft ich die Testdaten zu erstellen, sieht das Bild immer wie folgt aus: Graph

So ist der Trend der Zufallszahlen ist immer negativ. Warum das?

+2

Warum erstellen Sie ein neues 'Random'-Objekt in jeder Schleifeniteration? – Baz

+1

Nicht, dass es notwendigerweise Ihre Ergebnisse erklärt, aber Ihre Verwendung von 'Random' ist falsch. Sie müssen die gleiche Instanz für alle Anrufe freigeben, sonst erhalten Sie keine Pseudozufallsfolge **. –

+0

Verwenden Sie dieselbe Instanz von 'java.util.Random' zum Generieren aller Zufallszahlen. Dies wird "die Randomisierung erhöhen", indem die Randomisierung zu einer echten Pseudo-Randomisierung gemacht wird. – Vulcan

Antwort

6

Es ist ziemlich klar aus Ihrer Logik, dass es einen negativen Trend erstellen muss, auch wenn Sie ignorieren, dass Ihre Verwendung von Random nicht dem Vertrag folgt. Sie addieren eine Zahl im Bereich [0,2] die Hälfte der Zeit und subtrahieren eine Zahl im Bereich [3,5] die andere Hälfte der Zeit. Der Code ist einfach zu beheben, aber:

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

Und ein sauberer fix würde

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

Dies hat den zusätzlichen Vorteil, dass es den Wert manchmal zu bleiben unverändert erlaubt, die meiner Meinung nach sollte eine sein geeignetere Methode, um Ihre Daten zu simulieren.

+0

lol ... du hast Recht ... :) ahh, Logik, mein Feind ... danke! Ich werde Ihren Beitrag als Antwort in 5 min markieren –

+2

@ downvoter Warum auf der Erde würden Sie diese perfekt gute, akzeptierte Antwort ablehnen? Dies ist sicherlich nichts als Vandalismus und die traurigste Art - versteckt sich hinter Ihrer Anonymität. –

0

Ich weiß nicht, was ist Ihr Zweck, aber versuchen Sie, eine untere Grenze zu machen. Wie

2+random.nextInt() 

Wo zufällig ist Ihre Random-Klasse-Instanz. Und wie die anderen Leute sagten, benutze dieselbe Instanz, du kannst keine "richtige" Sequenz wie diese erzeugen.

2

Ich bin nicht sicher, was Sie versuchen zu tun, aber der folgende Block scheint einen negativen Trend

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

Sie fügen kleine Zahlen und Subtrahieren größere zu erzeugen.

+0

Richtig, Marko Topolnik hat mich gerade dazu gebracht ... manchmal ist das offensichtlichste am schwersten zu sehen: P –

Verwandte Themen