Java random всегда оказывает негативную тенденцию в долгосрочной перспективе?

Я создаю приложение, и для этого у меня есть функция, чтобы заполнить его тестовыми данными. Краткое описание:

        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

Таким образом, тренд случайных чисел всегда отрицательный. Почему это?

Ответ 1

Из вашей логики совершенно ясно, что она должна создать негативную тенденцию, даже игнорируя тот факт, что ваше использование 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;

У этого есть дополнительное преимущество, которое позволяет иногда оставаться неизменным, что, по моему мнению, должно быть более правильным способом имитации ваших данных.

Ответ 2

Я не уверен, что вы пытаетесь сделать, но следующий блок, кажется, создает отрицательную тенденцию

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

Вы добавляете небольшие числа и вычитаете более крупные.

Ответ 3

Я не знаю, какова ваша цель, но постарайтесь сделать нижнюю границу. Как

2+random.nextInt()

Если случайным является случайный экземпляр класса. И, как говорили другие ребята, используйте один и тот же экземпляр, вы не можете создать "правильную" последовательность, подобную этой.