2015-09-30 24 views
5

このエクササイズでは平均的な距離に問題があります。それはNステップのsqrtに近いはずですが、それは低くなっています。あなたは私の間違いがどこにあるのかを知る手伝いをすることができますか?シンプルな2Dランダムウォーク

2Dランダムウォーク。 2次元ランダムウォークは、点のグリッド内を移動するパーティクルの動作をシミュレートします。 ランダム歩行者は、確率1/4で北、南、東、または西に移動し、 は前の移動とは独立して移動します。ランダム歩行者がN歩後の出発点からどのくらい離れているか(平均して)決定する。 (理論的な答え:。SQRT(N)のオーダー)

public class RandomWalk{ 
    public static void main(String[] args){ 

    int N = Integer.parseInt(args[0]); 

    double nextStep = 0; 
    double averageDistance = 0; 
    int COUNT = 1000; 

    for (int j = 0; j < COUNT; j++){ 
     int moveWest = 0; 
     int moveEast = 0; 
     int moveSouth = 0; 
     int moveNorth = 0; 
     double distance = 0; 

     for (int i = 0; i < N; i++){ 
     nextStep = Math.random()*4; 
     if (nextStep <= 1) ++moveWest; 
      else if (nextStep <= 2) ++moveEast; 
      else if (nextStep <= 3) ++moveSouth; 
       else if (nextStep <= 4)++moveNorth;  
     } 

     moveEast = moveEast - moveWest; 
     moveNorth = moveNorth - moveSouth; 
     distance = Math.sqrt((moveEast * moveEast) + (moveNorth * moveNorth)); 
     averageDistance += distance; 

     System.out.println("Walker is " + distance + "\t steps away of from the starting point"); 
     //System.out.println("Sqrt of N is " + Math.sqrt(N)); 

    } 
    System.out.println("Average distance is " + averageDistance/COUNT + " steps away of from the starting point"); 
    } 
} 
+0

レンジ<0,1>から> 3,4(より大きいので、私はそれをテストしたが、大幅な変更を行っていない、まだ...ここからスタート。でも、どこでも、比較未満を使用してそれらを作るで始まると思います。 – zubergu

+1

私はそれがsqrt(N)やそれに類するものに収束するとは思わない。それはsqrt(N)の大きさのオーダーまたはそのようなものであると考えられる。またはmb O(sqrt(N))。数学... –

+0

それから私の解が正しいと思いますか? –

答えて

3

私は範囲< 0,1の前述の変化にあなたのコードのいくつかのテストを実行しました)、< 1,2へ

if (nextStep == 1) ++moveWest; 
      else if (nextStep == 2) ++moveEast; 
      else if (nextStep == 3) ++moveSouth; 
       else if (nextStep == 4)++moveNorth;  

について)、< 2,3)、< 3,4)それらを均一にする。

そして、あなたがそのようにそれを行う:

if (nextStep < 1) ++moveWest; 
      else if (nextStep < 2) ++moveEast; 
      else if (nextStep < 3) ++moveSouth; 
       else if (nextStep < 4)++moveNorth; 

お知らせ< =<になってきて。 100のステップの

100000試行の各々は、それらresutlsを与えた:

Average distance is 8.873435509749317 steps away of from the starting point 
W=2498906 
E=2501447 
N=2500022 
S=2499625 

、W、E、N、Sがすべての試験中に所定の方向のための手順を合計さ 。 彼らはうまく見えます。

このようなテストケースを数回実行すると、適切な方向がないことがわかります。あなたは乱数を得るために他の方法を使うかもしれませんが、それはあなたのケースではなくジェネレータをテストすることでしょう。あなたのコードは私の視点からは大丈夫です。 理論答え: SQRT(N)のオーダーの問題の記述から

文はまた、あなたの手掛かりを与えます。

+0

ありがとう。英語は母国語ではないので、すべての詳細を理解できないことがあります。 –

+0

@zubergu:Nitpicking:*私が間違っていない場合、[Math.random](http://docs.oracle.com/javase/7/docs/api/java/lang/Math.html#random%28% OPの元のコード分割を '[0.0、1.0]、(1.0、1.0)に分割するために、' 0.0、1.0 ' (2.0、3.0)、(3.0、4.0) '。 –

+1

@TobiaTesan正確には、以下のものから以下のものに切り替えることによって、すべての範囲を同じようにして片方が開いていて、私はこれを明確にするためにコードサンプルを編集しています。 – zubergu

1

私は、この行は動作しませんと思う:

nextStep = Math.random()*4; 

説明は論理1です。私は静的な単位であるステップで計算したいので、あなたの目的のために整数を使用する方が良いと思います。まあ意見に基づいていますが、私は部分的なステップを追跡するのではなく、完全なステップ数を数えることを推奨します。

が、この代わりにしてみてください:

Random rand = new Random(); 
nextStep = rand.nextInt(4)+1; //random numbers {1,2,3,4} 

さらに以来nextInt()がランダムInteger値を生成し、あなたのif/else文に代わり<===演算子を使用する必要があります。 トム(ない私に、コメント欄に1!)

+0

私はあなたの推論を理解していない、あなたはもう少し詳しく説明しますか? –

+0

OPに 'if(nextStep <= 1)'などがあることに注意してください。 –

+0

@TomWellbrock:今私は*もっと*困惑しています。 'Math.random()*(4 - 0);'は正確に同じでなければなりません(同じバイトコードにコンパイルするときと同じです)。私は何が欠けていますか? –

関連する問題