首页 > 解决方案 > 是什么导致 Java 版本随机游走不收敛到预期值?

问题描述

基本上,我用 Java 实现了一个随机游走程序。而且我知道距离应该收敛到l * (n ^ 0.5)l是步长,n是总步数)。如果 letl等于1,那么d = n ^ 0.5或换句话说:d = sqrt(n)

但是,奇怪的是,虽然我在我的代码中找不到任何错误,但它只是收敛到了意想不到的值。例如,给定l = 1, n = 100d应该收敛到10,但实际上它8.86在 1000000 次实验后收敛到。

这是我的代码:

public class RandomWalk {
    private int x = 0;
    private int y = 0;

    private final Random random = new Random();

    private void move(int dx, int dy) {
        x += dx;
        y += dy;
    }

    private void randomWalk(int m) {
        for (int i = 0; i < m; i++)
            randomMove();
    }

    private void randomMove() {
        boolean xOry = random.nextBoolean();
        boolean plusOrminus = random.nextBoolean();
        int delta = plusOrminus ? 1 : -1;
        int dx = xOry ? delta : 0, dy = xOry ? 0 : delta;
        move(dx, dy);
    }

    public double distance() {
        return Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));
    }

    public static double randomWalkMulti(int m, int n) {
        double totalDistance = 0;
        for (int i = 0; i < n; i++){
            RandomWalk walk = new RandomWalk();
            walk.randomWalk(m);
            totalDistance += walk.distance();
        }
        return totalDistance/n ;
    }
}

我想到了一些可能。首先,我认为这可能是由于生成booleanrandom有偏见造成的。其次,我认为这可能是由于浮点精度丢失造成的。但是由于这只是一个非常简单的用例,我认为这两种情况是不可能的。

谁能告诉我为什么它不能按预期工作?

标签: javaalgorithmrandomrandom-walk

解决方案


我不认为距离应该平均到 √<i>n 是真的。根据https://math.stackexchange.com/questions/103142/expected-value-of-random-walk,距离的平方应该平均到n,但这不是一回事(因为平方的平均值一组数字的根不等于它们平均值的平方根)。


推荐阅读