用Tcl/Tk脚本计算圆周率
读了阮一峰的蒙特卡罗方法入门,用概率统计的方式求解棘手的数学问题还挺有意思的,尤其是利用正方形和它的内切圆之间的面积关系来建模求解圆周率的方法精巧又简单,比投针实验好理解也好实现多了。建模可不是Matlab或者MAST/VHDL语言的专利,既然tcl/tk脚本也有内置的随机数产成函数rand(),那么我用tcl/tk建模计算圆周率也应该不在话下。
建模思想
正方形内部有一个相切的圆,它们的面积之比是π/4。
在这个正方形内部,随机产生足够多的点,计算它们与中心点的距离,从而判断是否落在圆的内部。如果这些点均匀分布,那么圆内的点应该占到所有点的 π/4,因此将这个比值乘以4,就是π的值。
脚本实现
tcl/tk内置math函数库的rand()方法可以随机生成0~1的浮点数,假设圆的半径为整数r,可以用以下方式产生(0,r)区间的随机整数:
set value [int[expr rand()* $range]]
为了计算简便,可以把模型进一步简化,只计算第一象限内的点落入圆内的比例。为了验证tcl/tk的rand()函数是否真的随机,我又多加了几行tk代码,把所有的点都显示出来。下面的代码中正方形的边长为300,随机产生300*300个点,理想情况下如果随机点100%均匀分布,那么每个点应该恰好对应一个像素。
tcl/tk代码:
proc CaculatePi{runs range canvas}{set r $rangeset hits 0set run 0while{$run < $runs}{set rPower2 [expr pow($r,2)]set ptX [int[expr rand()* $range]]set ptY [int[expr rand()* $range]]# display point on canvas$canvas create line [expr $ptX +5][expr $ptY +5][expr $ptX +5][expr $ptY +5]set ptPower2 [expr pow($ptX,2)+ pow($ptY,2)]if{[expr $rPower2 - $ptPower2]>=0}{incr hits}incr run}set pi [expr $hits *4/double($runs)]return $pi}set range 300catch{destroy .c}# leave 10 pts margin for rectangleset canvas [canvas .c -width [expr $range +10]-height [expr $range +10]]pack $canvas -fill both$canvas create oval 55[expr $range +5][expr $range +5]-outline blue -width 2$canvas create rect 55[expr $range +5][expr $range +5]-outline blue -width 2set pi [CaculatePi[expr $range * $range] $range $canvas]puts "Pi:$pi"
计算结果和显示
Pi:3.1512888888889
90000个随机点,但是结果居然比祖冲之老先生手工割圆的精度还低很多很多。再看看Canvas上的点图虽然不是一片漆黑,但是点的分布也比较一致均匀,再增加些随机点试试看? 把点数增加到100万,画布虽然一片漆黑,Pi结果为3.145944,精度还是很有限。难道tcl/tk的rand()函数产生的伪随机数还是不够随机?
用Tcl/Tk脚本计算圆周率的更多相关文章
- freewrap——将tcl/tk脚本转变为可执行文件
FreeWrap可以把TCL/TK的脚本和二进制文件打包成应用程序,FreeWrap将所有的文件组合成一个单独的可执行文件. FreeWrap的原理是把脚本和tcl/tk解释器和库文件都打包 ...
- Tcl Tk Introduction
Tcl Tk Introduction eryar@163.com 摘要Abstract:Tcl/Tck脚本可以很容易实现用户自定义的命令,方便的创建图形化的用户界面GUI,所以Tcl和Tk的应用领域 ...
- Tcl/tk缩放Truetype字体时的精度问题
最近有国内新客户抱怨我们产品显示的原理图太不专业了,在原理图上使用宋体GB2312设计好中文图表,经过几次缩放时,表格内的文字居然会跑到表格外边,更要命的是打印出来的文档也存在同样的问题. 我研究了一 ...
- Mac OS X下让ruby支持tcl/tk
我记得在老早在OS X10.8下使用ruby1.9.x的时候只要到下载安装ActiveTcl8.5,没怎么配置就运行tk好好的.但是近日想重新执行下tk代码,发现在require 'tk'的时候就报错 ...
- 运行Spark提供的计算圆周率的示例程序
1.启动Spark服务 因为spark是依赖于hadoop提供的分布式文件系统的,所以在启动spark之前,先确保hadoop在正常运行. 在hadoop正常运行的情况下,在master(也就是had ...
- pgtksh -- PostgreSQL Tcl/Tk shell 客户端
SYNOPSIS pgtksh [filename [argument...]] DESCRIPTION 描述 pgtksh 是一个带有 PostgreSQL 数据库访问函数扩展的 Tcl/Tk sh ...
- python INFO: Can't locate Tcl/Tk libs and/or headers
安装opencv的时候遇到这个错误: python INFO: Can't locate Tcl/Tk libs and/or headers 参考如下文章解决这个问题: http://www.ver ...
- tcl/tk demo
环境及版本说明: OSX10.9 tclsh -> tclsh8.5 wish -> wish8.5 查看本机运行环境: which wish; 2 /usr/bin/wish which ...
- linux下ruby使用tcl/tk编程环境设置
正常情况下最新的ruby都是不带tcl/tk选项编译的,所以我们在运行tcl/tk代码时都会发生找不到tk库的错误.解决办法很简单只要以tcl/tk选项编译ruby即可. 这里以ubuntu 15.0 ...
随机推荐
- xamarin mac 基础知识 之 界面
有两种方式创建界面:代码和xaml
- bzoj2120: 数颜色 &&bzoj2453: 维护队列
题目大意: 你小时候玩过弹珠吗? 小朋友A有一些弹珠,A喜欢把它们排成队列,从左到右编号为1到N.为了整个队列鲜艳美观,小朋友想知道某一段连续弹珠中,不同颜色的弹珠有多少.当然,A有时候会依据个人喜好 ...
- Linux用户和用户组管理总结
Linux下和用户和用户组管理有关的配置文件: /etc/group Group account information. /etc/gshadow Secure group account info ...
- Violin 琴弦介绍
共四根弦,从粗到细: 第四弦:音名:G:唱名:Sol 第三弦:音名:D:唱名:Re 第二弦:音名:A:唱名:La 第一弦:音名:E:唱名:Mi
- javac不是内部或外部命令
1.描述 在命令行输入javac,提示“不是内部或外部命令”. 2.解决过程 2.1.解决方案一 2.1.1.检查并添加环境变量 通常就是这个原因导致. 2.1.2.过程一 确实还是环境变量没有写对. ...
- 如何去掉Atom的右键菜单?
Win+R -- regedit -- Ctrl+F -- 搜索"Atom"(或者直接"Open with Atom") -- 找到有个值为Open with ...
- Java之模板方法模式(Template Method)
Java之模板方法模式(Template Method) 1. 概念:定义一个算法的骨架,而将一些实现步骤延迟到子类中. 把不变的行为搬到超类,去除子类中重复的代码来体现他的优势. 2. UML图: ...
- iis的web站点配置
1.下载好pageadmin网站系统,我下载的放在F:\web\site目录下(每个电脑或每个用户放置目录都不一样,你也可以放C:\myweb,或D:\xxx等等,只要下面对应目录设置一样即可),我们 ...
- Python爬虫基础
前言 Python非常适合用来开发网页爬虫,理由如下: 1.抓取网页本身的接口 相比与其他静态编程语言,如java,c#,c++,python抓取网页文档的接口更简洁:相比其他动态脚本语言,如perl ...
- CodeForces 722B
B. Verse Pattern time limit per test:1 second memory limit per test:256 megabytes input:standard inp ...