简单的2D随机游走

时间:2015-09-30 12:49:27

标签: java random

我在练习中遇到平均距离问题。它应该接近N步的sqrt,但它更低。你能帮我找出我的错误吗?

2D随机游走。 二维随机游走模拟在点网格中移动的粒子的行为。 在每一步,随机游走者以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");
    }
}

2 个答案:

答案 0 :(得分:3)

我对你的代码进行了一些测试,上面改变了范围&lt; 0,1),&lt; 1,2),&lt; 2,3),&lt; 3,4),使它们均匀。

你这样做:

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

注意&lt; = 成为&lt;

每次100步的100000次试验给出了这些结果:

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)的顺序。

答案 1 :(得分:1)

我认为这条线不会起作用:

nextStep = Math.random()*4;

解释是合乎逻辑的。我认为最好将Integers用于你的目的,因为你想用步骤计算,这是一个静态单位。那是基于意见的,但我建议计算完整的步骤而不是跟踪部分步骤。

试试这个:

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

此外,由于nextInt()生成随机Integer值,因此您需要在if / else语句中使用==运算符而不是<=

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

关于 Tom (不是我,评论中的那个!)