【发布时间】:2018-01-14 23:34:15
【问题描述】:
我已经用 C++ 和 Python 实现了一维随机游走;但是,在这两个程序中,期望值都不是 sqrt(N)。我想知道我的代码中是否存在逻辑错误或某些隐藏因素导致我的结果一直很低。
对于那些不熟悉随机游走的人,预期的 RMS 值为 sqrt(N)。在这里找到更多信息:http://www.mit.edu/~kardar/teaching/projects/chemotaxis(AndreaSchmidt)/random.htm
我始终得到大约 80% 的 sqrt(N),例如:
N = 100,结果 = 80,79,81,78...
N = 25,结果 = 3.9、4.1、4.2、3.8...
代码如下:
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <cstdlib>
#include <iostream>
#include <cmath>
#include <math.h>
float random_walk(int i);
float checkrand(int i);
using namespace std;
int main(int argc, char* argv[]){
srand(time(NULL));
float absolute = 0;
int trials = 1000;
for(int i=0; i<trials; i++){
absolute += sqrt(pow(random_walk(atoi(argv[1])),2));
}
cout<<absolute/trials<<endl;
}
float random_walk(int i){
float walk = 0;
for(int j=0; j<i; j++){
if(rand()%2 == 0){
walk--;
}
else{
walk++;
}
}
return walk;
}
我的 python 代码也得到了相同的输出。
import random
def rand_walk():
walk = 0
for i in range(9):
rand = random.randint(0,1)
if(rand == 0):
walk = walk + 1
else:
walk = walk - 1
return walk
absolute = 0.0
numtrial = 100
for j in range(numtrial):
walk = rand_walk()
absolute = absolute + (walk**2)**(1/2.0)
print "Average Absolute Distance ", absolute/numtrial
我希望得到 sqrt(n),但总是得到更少,这让我怀疑自己是做错了什么还是对问题的思考错了。
【问题讨论】:
-
预期的距离不是 sqrt(n),而是 sqrt(2n/π),所以你的结果是正确的。
-
请注意,基本上,均方根不等于绝对均值。