一维随机游走预期值

1D Random Walk Expected Value

本文关键字:随机 一维      更新时间:2023-10-16

我在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(,但总是得到更少,这让我怀疑我是否做错了什么或想错了问题。

我主要使用Python,所以我会用这种语言来回答。

你用 absolute = absolute + (walk**2)**(1/2.0) 计算的是 sqrt(d^2( 的总和,但你必须取的意思是 RMS 在 sqrt 之前的意思。

d2_list = []
for j in range(numtrial):
    walk = rand_walk(N)
    # absolute = absolute + (walk**2)**(1/2.0)
    d2_list.append(walk**2)
result = (sum(d2_list) / len(d2_list))**(1/2.)
print "Average Absolute Distance ", result