代码之家  ›  专栏  ›  技术社区  ›  Sraw

什么原因导致Java版本的随机游走没有收敛到期望值?

  •  0
  • Sraw  · 技术社区  · 6 年前

    基本上,我用Java实现了一个随机行走程序。我知道距离应该收敛到 l * (n ^ 0.5) l n 1 ,那么 d = n ^ 0.5 或者换句话说: d = sqrt(n) .

    但是,令人窒息的是,虽然我在代码中找不到任何错误,但它只是收敛到了意外的值。例如,给定 l = 1, n = 100 , d 10 ,但实际上它收敛到 8.86 经过100万次的实验。

    这是我的密码:

    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 ;
        }
    }
    

    我想了一些可能性。首先我认为这可能是由于 boolean 通过 random 有偏见。第二,我认为可能是浮子精度丢失造成的。但由于这只是一个非常简单的用例,我认为这两种情况是不可能的。

    有人能告诉我为什么它不能按预期工作吗?

    1 回复  |  直到 6 年前
    推荐文章