博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Random Walk Simulation (Python)
阅读量:6291 次
发布时间:2019-06-22

本文共 3603 字,大约阅读时间需要 12 分钟。

hot3.png

问题:平面内一个物体Object的初始坐标(0,0),此后,每秒进行一个移动,每次移动1,方向是上下左右。即,newLocation = oldLocation + (x, y),其中(x,y) = (0,1) or (0, -1) or (1, 0) or (-1, 0)。那么,N秒后,Object离初始坐标的距离,会不会随着N的增加而增加?

分析:问题的本质是求N秒后的期望距离。这里有一点要注意,N秒后的期望距离和N秒后object最有可能出现的位置是两个该问题!搞清了这一点之后,我们就知道E(dist) = sigma(dist[i] * p[i]),其中dist[i]是离(0,0)的距离,p[i]是此距离的概率。由此,我们可以得到一个直观的概念,期望距离会随着N的增加而增加。(实际上,用数学的概率分布可以证明)

以下,用python来仿真这一过程,证明这一结论

代码

#!/usr/bin/python                                                                                                            import pylabimport randomimport mathdef distance(location):    return math.sqrt( location[0]**2 + location[1]**2 )def simulate(count):    location = [0, 0]    countLeft = 0    countRight = 0    countUp = 0    countDown = 0    for i in range(0, count):        direction = random.choice(["left", "right", "up", "down"])#        print "direction = ", direction                                                                                             if (direction == "left"):            location[0] -= 1            countLeft += 1        if (direction == "right"):            location[0] += 1            countRight += 1        if (direction == "up"):            location[1] += 1            countUp += 1        if (direction == "down"):            location[1] -= 1            countDown += 1#       print "location = ", location               dist = distance(location)        result.append(dist)    print countLeft, countRight, countDown, countUp    returnresult = []simulate(10000)pylab.title('random walk simulation')pylab.xlabel('time/s')pylab.ylabel('distance/m')pylab.plot(result)pylab.show()

运行结果:

 

 改进:

我们看到,一次试验只能给人一个直观映像,即,随着step的增加,与原点的距离也在增加。但是,一次试验的随机性比较高,这导致结果的振动幅度比较大,无法很好的看出dist和step的关系。如何改进这一点呢?

用取平均的方法来消除随机误差。这里,我们对500次试验取平均。

以下是改进后的试验结果:

以下是改进后的代码:

#!/usr/bin/pythonimport pylabimport randomimport mathdef distance(location):    return math.sqrt( location[0]**2 + location[1]**2 )def simulate(count):        location = [0, 0]    countLeft = 0    countRight = 0    countUp = 0    countDown = 0    result = []        for i in range(0, count):        direction = random.choice(["left", "right", "up", "down"])#        print "direction = ", direction        if (direction == "left"):            location[0] -= 1            countLeft += 1        if (direction == "right"):            location[0] += 1            countRight += 1        if (direction == "up"):            location[1] += 1            countUp += 1        if (direction == "down"):            location[1] -= 1            countDown += 1#       print "location = ", location        dist = distance(location)        result.append(dist)    return resultdef performTrial(steps, tries):    distLists = []    for i in range(0, tries):        result = simulate(steps)        distLists.append(result)    return distListsdef main():    steps = 3    tries = 500    distLists = performTrial(steps, tries)    averageList = [0]    for i in range(0, steps):        total = 0        for j in range(0, tries):            total += distLists[j][i]        average = total/tries        averageList.append(average)#        print 'total=', total#        print 'average=', average#        print averageList    pylab.plot(averageList)    pylab.title('random walk simulation')    pylab.xlabel('time/s')    pylab.ylabel('distance/m')    pylab.show()    returnif __name__ == '__main__':    main()

 

最后用简单的例子来证明正确性:

steps = 0  dist = 0

steps = 1  dist = 1

steps = 2  dist = (2+0+sqrt(2)+sqrt(2))/4 = 1.21

step3 = 3  dist = (3+1+sqrt(5)+sqrt(5)+...+...)/16 = 1.59

如下是steps=3, tries=500的结果图示,和以上数学分析结果一致。

 

 

 

 

 

转载于:https://my.oschina.net/u/158589/blog/60821

你可能感兴趣的文章
白帽子守护网络安全,高薪酬成大学生就业首选!
查看>>
ARM想将芯片装进人类大脑 降低能耗是一大挑战
查看>>
Oracle数据库的备份方法
查看>>
Selenium 自动登录考勤系统
查看>>
关于如何以编程的方式执行TestNG
查看>>
智能照明造福千家万户 家居智能不再是梦
查看>>
物联网如何跳出“看起来很美”?
查看>>
浅谈MySQL 数据库性能优化
查看>>
《UNIX/Linux 系统管理技术手册(第四版)》——1.10 其他的权威文档
查看>>
灵动空间 创享生活
查看>>
《UNIX网络编程 卷1:套接字联网API(第3版)》——8.6 UDP回射客户程序:dg_cli函数...
查看>>
不要将时间浪费到编写完美代码上
查看>>
《算法基础:打开算法之门》一3.4 归并排序
查看>>
高德开放平台开放源代码 鼓励开发者创新
查看>>
《高并发Oracle数据库系统的架构与设计》一2.5 索引维护
查看>>
Firefox 是 Pwn2own 2014 上攻陷次数最多的浏览器
查看>>
阿里感悟(十八)- 应届生Review
查看>>
话说模式匹配(5) for表达式中的模式匹配
查看>>
《锋利的SQL(第2版)》——1.7 常用函数
查看>>
jquery中hover()的用法。简单粗暴
查看>>