java - 是什么导致 Java 版本随机游走不收敛到预期值?
问题描述
基本上,我用 Java 实现了一个随机游走程序。而且我知道距离应该收敛到l * (n ^ 0.5)
(l
是步长,n
是总步数)。如果 letl
等于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
有偏见造成的。其次,我认为这可能是由于浮点精度丢失造成的。但是由于这只是一个非常简单的用例,我认为这两种情况是不可能的。
谁能告诉我为什么它不能按预期工作?
解决方案
我不认为距离应该平均到 √<i>n 是真的。根据https://math.stackexchange.com/questions/103142/expected-value-of-random-walk,距离的平方应该平均到n,但这不是一回事(因为平方的平均值一组数字的根不等于它们平均值的平方根)。
推荐阅读
- angular - 拉动刷新 VS 实时 VS 可观察/订阅模式
- java - 如何调试使用 Docker Compose 运行的 Glassfish 应用程序
- mysql - 包含 NULL 作为值的列未在审计表中得到审计。我正在使用更新后触发器
- php - 如何从 PHP 数组中删除/过滤非英文值?
- linux - LKM - 无法编译模块 - 缺少头文件但已安装头包
- swift - UICollectionViewController 没有获得父属性
- python-2.7 - Boto3 Upload_file - TypeError:预期的字符串或缓冲区
- gwt - GWT 编辑器 - MaterialComboBox 可分配给原始编辑器类型,但需要类型参数化
- vbscript - 如何为自定义表单启用 VBScript?
- c# - 将 AWS lambda 父段标记为故障或错误