По сути, я реализовал программу Random Walk в Java.И я знаю, что расстояние должно сходиться к l * (n ^ 0.5)
(l
- длина шага, n
- общее количество шагов).Если пусть l
равно 1
, то d = n ^ 0.5
или другими словами: d = sqrt(n)
.
Но, как ни странно, хотя я не могу найти никакой ошибки в своем коде, он просто сходится к неожиданному значению,Например, если l = 1, n = 100
, d
должно сходиться к 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 ;
}
}
Я подумал о некоторых возможностях.Сначала я думаю, что это может быть вызвано тем, что сгенерированный boolean
на random
имеет уклон.Во-вторых, я думаю, что это может быть вызвано потерей точности.Но так как это очень простой вариант использования, я не думаю, что эти две ситуации возможны.
Может кто-нибудь сказать мне, почему это не работает, как ожидалось?