xavier 2007-8-6 13:26
[8月CASE]一、用概率算PI
原理:
有一个半径为r的圆外接一个边长为2r的正方形。
S圆 = r**2*pi
S方 = 2r**2
现在往正方形里撒点,撒到圆里的点的个数比撒到圆外的点的个数的比就是一个与pi有关的式子,就能估算出近似的pi来,撒的点越多值越精确。
[code]
def dpi(a) #定义一个方法,参数是模拟撒点的数量
k = 0 #变量k用来记录撒到圆里面的点的数目
srand() #生成随机种子
a.times do |i| #开始撒点了!
x = rand() - 0.5 #不带参数的调用rand就会生成从0,1的随机数(float型),再减0.5就相当于生成从-0.5到0.5的随机数
y = rand() - 0.5 #同上,这下点的左边就有了
x2 = x.abs**2 #(x**2+y**2)**0.5,两点间距离公式........
y2 = y.abs**2 #同上,着两个备用的
if (x2 + y2) ** 0.5 <= 0.5 #如果点到原点的距离小于等于0.5,就是撒到了圆里
k += 1 #相当于k = k+1
end
end
pi = ((4 * k.to_f) / a.to_f).to_f #此时pi就等于圆的面积比矩形的面积,to_f是转成浮点数(小数)
return pi #把算好的pi值返回出去
end
[/code]
算10万个点就能出3.14了
有一次早晨到班里就开始算13亿个点,算10次,取平均。到中午算完了结果是
3.1415918006254
算pi的方法比这快比这准的方法那就太多了
我这个就全当自娱自乐和练习ruby好了
---------------------------------------------------------
应itachi007之邀写上注释,顺便改进了一下。
(ruby真是好,半年前写的代码现在看起来一点不费力......)
[[i] 本帖最后由 xavier 于 2007-9-10 16:31 编辑 [/i]]
xavier 2007-8-6 16:19
那就太多了....画个圆量面积,找个球量体积不都可以么...
drive2me 2007-8-6 20:55
给俺们说明一下,那个srand()和rand()是啥,他们有啥区别?
xavier 2007-8-7 08:14
srand是随机种子。
rand就是生成随机数了,不带参数调用的话,生成从0到1的随机数
blackanger 2007-8-7 11:03
我也忘了怎么算PI了。。。
itachi007 2007-9-9 21:26
没看懂
小生愚钝,没看懂楼主的程序,能给解释一下么。
最好给每一行加个注释,告诉大家为什么那么做。
xavier 2007-9-10 16:31
回复 #7 itachi007 的帖子
你现在再看看呢~看看明白了没有
blackanger 2007-9-10 18:04
哈哈,太详细了
itachi007 2007-9-23 16:41
to 楼主
[quote]原帖由 [i]xavier[/i] 于 2007-9-10 16:31 发表 [url=http://ruby-lang.org.cn/forums/redirect.php?goto=findpost&pid=4754&ptid=702][img]http://ruby-lang.org.cn/forums/images/common/back.gif[/img][/url]
你现在再看看呢~看看明白了没有 [/quote]
这下看懂了,多谢。:)
jmouse 2008-3-1 17:34
转一个有关PI计算的数学理论。
[url]http://zh.wikipedia.org/wiki/%E5%9C%93%E5%91%A8%E7%8E%87[/url]
用Leibniz 定理:
[code]
def test(x)
sum = 0
1.step(x,2) {|i|
sum += (-1)**((i-1)/2 % 2) * 1.0 /i
}
puts sum * 4
end
#test
test(100000)
[/code]