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

无论我多久创建一次测试数据,图片看起来总是这样: 图形

所以随机数的趋势总是负的。这是为什么?

4

3 回答 3

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;

这有一个额外的好处,它允许值有时保持不变,我认为这应该是模拟数据的更合适的方法。

于 2012-09-21T10:28:57.310 回答
2

我不确定您要做什么,但是以下块似乎会产生负面趋势

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

您正在添加小数字并减去较大的数字。

于 2012-09-21T10:29:48.460 回答
0

我不知道你的目的是什么,但试着做一个下限。喜欢

2+random.nextInt()

random 是您的 Random 类实例。正如其他人所说,使用相同的实例,您无法生成这样的“正确”序列。

于 2012-09-21T10:27:10.543 回答