2012-09-21 5 views
11

私はアプリケーションを構築しており、そのためにテストデータを入力する機能があります。 ショート概要:Javaランダムは常に長期的にマイナスの傾向を示していますか?

 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

だから、乱数の傾向は常に負です。何故ですか?

+2

なぜ各ループ反復で新しい 'Random'オブジェクトを作成しますか? – Baz

+1

必ずしもあなたの結果を説明しているわけではありませんが、あなたの「ランダム」の使い方は間違っています。すべての呼び出しで同じインスタンスを共有する必要があります。そうしないと、疑似ランダム**シーケンス**が得られません。 –

+0

すべての乱数の生成に 'java.util.Random'の同じインスタンスを使用します。これは、ランダム化を真の擬似ランダム化にすることによって、「ランダム化を増やす」でしょう。 – Vulcan

答えて

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; 

これは私があるべきと信じて、それは価値が時々そのまま滞在することができますという追加の利点を、持っているだろうデータをシミュレートするためのより適切な方法。

+0

笑...あなたは正しい... :)ああ、論理、私の敵...ありがとう!私はあなたの記事を5分で答えにします。 –

+2

@downvoterなぜ地球上でこれは完全に良い、受け入れられた答えをdownvoteしますか?これは確かに破壊行為であり、あなたの匿名の背後に隠れている最悪のものです。 –

0

あなたの目的はわかりませんが、下限を作ろうとします。 Like

2+random.nextInt() 

ランダムはあなたのランダムクラスインスタンスです。そして、他の人が言ったように、同じインスタンスを使用して、そのような "正しい"シーケンスを生成することはできません。

2

私はあなたがやろうとしているのかわからないけど、次のブロックでは、あなたが小さな数字を追加し、大きいものを引いている負の傾向

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

を作るように思われます。

+0

右、Marko Topolnikはちょうど私にこれをもたらしました。時には最も明白なことは時々見えにくいです:P –

関連する問題