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 に答える