2012-09-21 10 views
11

Estoy construyendo una aplicación y para eso tengo una función para completarla con datos de prueba. esquema corta:Java aleatorio siempre está generando una tendencia negativa en el largo plazo?

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

No importa cuántas veces puedo crear los datos de prueba, la imagen se ve siempre así: Graph

Así que la tendencia de los números aleatorios es siempre negativo. ¿Porqué es eso?

+2

¿Por qué creas un nuevo objeto 'Random' en cada iteración de bucle? – Baz

+1

No es que necesariamente explique sus resultados, pero su uso de 'Random' es incorrecto. Debe compartir la misma instancia en todas las llamadas; de lo contrario, no obtendrá una ** secuencia ** pseudoaleatoria. –

+0

Utilice la misma instancia de 'java.util.Random' para generar todos los números aleatorios. Esto "aumentará la aleatorización" al hacer la aleatorización verdadera pseudoaleatorización. – Vulcan

Respuesta

6

Es bastante claro por su lógica que debe crear una tendencia negativa, incluso ignorando el hecho de que su uso de Random no cumple con el contrato. Agregue un número en el rango [0,2] la mitad del tiempo y restar un número en el rango [3,5] la otra mitad del tiempo. El código es fácil de solucionar, sin embargo:

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

Y una solución más limpia sería

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

Esto tiene la ventaja adicional de que permite que el valor para permanecer sin cambios a veces, que yo creo que debería ser una forma más adecuada para simular tus datos.

+0

lol ... tienes razón ... :) ahh, lógica, mi enemigo ... ¡gracias! Marcaré tu publicación como respuesta en 5 minutos –

+2

@downvoter ¿Por qué demonios rechazarías esta respuesta perfectamente buena y aceptada? Esto no es más que vandalismo, y el tipo más triste - escondiéndose detrás de su anonimato. –

0

No sé cuál es su propósito, pero intente hacer un límite inferior. Como

2+random.nextInt() 

Donde aleatorio es su instancia de clase Aleatoria. Y como dijeron los demás, usa la misma instancia, no puedes generar una secuencia "correcta" como esa.

2

No estoy seguro de lo que está tratando de hacer, pero el siguiente bloque parecería producir una tendencia negativa

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

Está añadiendo pequeñas cantidades y restando los más grandes.

+0

Derecha, Marko Topolnik me acaba de traer a esto ... a veces el más obvio es el más difícil de ver: P –

Cuestiones relacionadas