2012-09-21 11 views
11

Sto costruendo un'app e per questo ho una funzione da riempire con i dati di test. Breve profilo:Java random restituisce sempre una tendenza negativa a lungo termine?

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

Non importa quante volte creo i dati del test, l'immagine sembra sempre così: Graph

Così l'andamento dei numeri casuali è sempre negativo. Perché?

+2

Perché si crea un nuovo oggetto 'Random' in ogni ciclo iterativo? – Baz

+1

Non necessariamente spiega i risultati, ma l'uso di 'Random' è sbagliato. Devi condividere la stessa istanza per tutte le chiamate, altrimenti non otterrai una sequenza ** pseudocasuale **. –

+0

Utilizza la stessa istanza di 'java.util.Random' per la generazione di tutti i numeri casuali. Ciò "aumenterà la randomizzazione" rendendo la pseudo-randomizzazione della randomizzazione vera. – Vulcan

risposta

6

E 'abbastanza chiaro dalla tua logica che deve creare una tendenza negativa, ignorando anche il fatto che l'utilizzo di Random non segue il contratto. Aggiungi un numero nell'intervallo [0,2] metà del tempo e sottrai un numero nell'intervallo [3,5] nell'altra metà del tempo. Il codice è facile da risolvere, però:

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

E una correzione più pulito sarebbe

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

Questo ha il vantaggio aggiuntivo che permette il valore di rimanere invariato a volte, che a mio avviso dovrebbe essere un modo più corretto per simulare i tuoi dati.

+0

lol ... hai ragione ... :) ahh, logica, mio ​​nemico ... grazie! Segnalo come risposta in 5 min –

+2

@downvoter Perché sulla Terra avresti downvotare questa risposta perfettamente valida e accettata? Questo non è altro che vandalismo e il tipo più doloroso che si nasconde dietro il tuo anonimato. –

0

Non so qual è il tuo scopo, ma prova a fare un limite inferiore. Mi piace

2+random.nextInt() 

Dove casuale è l'istanza della classe Casuale. E come hanno detto gli altri ragazzi, usa la stessa istanza, non puoi generare una sequenza "corretta" del genere.

2

Non sono sicuro di quello che si sta cercando di fare, ma il seguente blocco sembrerebbe produrre un trend negativo

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

Si sta aggiungendo piccoli numeri e sottraendo quelli più grandi.

+0

Giusto, Marko Topolnik mi ha appena portato a questo ... a volte il più ovvio è il più difficile da vedere: P –

Problemi correlati