基本上,我用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
有偏见。第二,我认为可能是浮子精度丢失造成的。但由于这只是一个非常简单的用例,我认为这两种情况是不可能的。
有人能告诉我为什么它不能按预期工作吗?