C:随机游走(布朗运动)程序不返回预期的理论值.为什么?
这只是基于“Feynman物理学讲座”第6-3节的实验:
资料来源: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 ( "%gn",expected_distance ); return EXIT_SUCCESS; } /* ---------- end of function main ---------- */ 解决方法
从您链接到的讲座中,您的理论期望基于
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 ( "%gn",expected_distance ); return EXIT_SUCCESS; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |