首页 技术 正文
技术 2022年11月17日
0 收藏 410 点赞 2,153 浏览 1450 个字

 

读了阮一峰的蒙特卡罗方法入门,用概率统计的方式求解棘手的数学问题还挺有意思的,尤其是利用正方形和它的内切圆之间的面积关系来建模求解圆周率的方法精巧又简单,比投针实验好理解也好实现多了。建模可不是Matlab或者MAST/VHDL语言的专利,既然tcl/tk脚本也有内置的随机数产成函数rand(),那么我用tcl/tk建模计算圆周率也应该不在话下。

建模思想

正方形内部有一个相切的圆,它们的面积之比是π/4。

在这个正方形内部,随机产生足够多的点,计算它们与中心点的距离,从而判断是否落在圆的内部。如果这些点均匀分布,那么圆内的点应该占到所有点的 π/4,因此将这个比值乘以4,就是π的值。

脚本实现

tcl/tk内置math函数库的rand()方法可以随机生成0~1的浮点数,假设圆的半径为整数r,可以用以下方式产生(0,r)区间的随机整数:

  1. set value [int[expr rand()* $range]]

为了计算简便,可以把模型进一步简化,只计算第一象限内的点落入圆内的比例。为了验证tcl/tk的rand()函数是否真的随机,我又多加了几行tk代码,把所有的点都显示出来。下面的代码中正方形的边长为300,随机产生300*300个点,理想情况下如果随机点100%均匀分布,那么每个点应该恰好对应一个像素。

tcl/tk代码:

  1. proc CaculatePi{runs range canvas}{
  2. set r $range
  3. set hits 0
  4. set run 0
  5. while{$run < $runs}{
  6. set rPower2 [expr pow($r,2)]
  7. set ptX [int[expr rand()* $range]]
  8. set ptY [int[expr rand()* $range]]
  9. # display point on canvas
  10. $canvas create line [expr $ptX +5][expr $ptY +5][expr $ptX +5][expr $ptY +5]
  11. set ptPower2 [expr pow($ptX,2)+ pow($ptY,2)]
  12. if{[expr $rPower2 - $ptPower2]>=0}{
  13. incr hits
  14. }
  15. incr run
  16. }
  17. set pi [expr $hits *4/double($runs)]
  18. return $pi
  19. }
  20. set range 300
  21. catch{destroy .c}
  22. # leave 10 pts margin for rectangle
  23. set canvas [canvas .c -width [expr $range +10]-height [expr $range +10]]
  24. pack $canvas -fill both
  25. $canvas create oval 55[expr $range +5][expr $range +5]-outline blue -width 2
  26. $canvas create rect 55[expr $range +5][expr $range +5]-outline blue -width 2
  27. set pi [CaculatePi[expr $range * $range] $range $canvas]
  28. puts "Pi:$pi"

计算结果和显示

Pi:3.1512888888889

90000个随机点,但是结果居然比祖冲之老先生手工割圆的精度还低很多很多。再看看Canvas上的点图虽然不是一片漆黑,但是点的分布也比较一致均匀,再增加些随机点试试看? 把点数增加到100万,画布虽然一片漆黑,Pi结果为3.145944,精度还是很有限。难道tcl/tk的rand()函数产生的伪随机数还是不够随机?

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,071
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,549
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,397
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,174
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,809
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,889