【问题标题】:1D Random Walk Expected Value一维随机游走期望值
【发布时间】: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/π),所以你的结果是正确的。
  • 请注意,基本上,均方根不等于绝对均值。

标签: python c++ random


【解决方案1】:

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

您使用absolute = absolute + (walk**2)**(1/2.0) 计算的结果是 sqrt(d^2) 的总和,但您必须在 sqrt 之前为 RMS 取平均值。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-19
    • 1970-01-01
    • 1970-01-01
    • 2020-07-25
    • 2014-03-26
    • 1970-01-01
    相关资源
    最近更新 更多