C:随机游走(布朗运动)程序不返回预期的理论值。为什么?

时间:2014-10-07 21:43:18

标签: c random probability

这只是基于“Feynman物理学讲座”第6-3节的实验:

  

在最简单的版本中,我们想象一个“游戏”,其中一个“玩家”   从x = 0开始,每次“移动”都需要迈出一步   向前(朝+ x)或向后(朝向-x)。选择是   例如,通过掷硬币来确定随机,确定。

来源:http://www.feynmanlectures.caltech.edu/I_06.html#Ch6-S3

我的目标是计算距离说明点的预期距离。所以,我想每一步都等于一个距离单位。我写了一个简单的C程序来模拟30个随机步骤,然后计算起点的最终距离。重复一百万次,程序平均距离以获得预期距离。

理论上,预期距离应该是步数的平方根。这应该是sqrt(30)= 5.48。

但是,该程序运行几次并保持返回接近4.33的值(更准确地说,4.33461,4.33453和4.34045)。为什么它甚至不接近理论值约5.48?

这是我的代码:

#include    <time.h>
#include    <stdlib.h>
#include    <stdio.h>

int main ( int argc, char *argv[] )
{

  int number_of_steps = 30;
  int repetition = 1000000;
  int distance = 0;
  int total_distance = 0;
  double expected_distance;
  int i, j;

  srand(time(NULL));

  for ( i = 0; i < repetition; i++ ) {

    for ( j = 0; j < number_of_steps; j++) {
      distance += rand() & 1 ? -1 : 1;
    }

    total_distance += abs(distance);
    distance = 0;

  }

  expected_distance = (float) total_distance / i;

  printf ( "%g\n", expected_distance );
  return EXIT_SUCCESS;
}       /* ----------  end of function main  ---------- */

2 个答案:

答案 0 :(得分:6)

根据您所关联的讲座,您的理论期望基于root mean square,这与您编码的arithmetic mean不同。通过将算法从一个更改为另一个,the code现在可以为您提供预期的结果。

for ( i = 0; i < repetition; i++ ) {

    for ( j = 0; j < number_of_steps; j++) {
      distance += rand() & 1 ? -1 : 1;
    }

    total_distance += distance * distance;
    distance = 0;

  }

  expected_distance = sqrt((float) total_distance / repetition);

  printf ( "%g\n", expected_distance );
  return EXIT_SUCCESS;
}

答案 1 :(得分:2)

The answer to this post表明使用rand()的低位比特不太可能是一个很好的选择。

我尝试以不同的方式生成+1或-1。