查看完整版本: [8月CASE]一、用概率算PI

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]]

admin 2007-8-6 15:48

我可真不知道如何算PI。告诉我另外的方法吧。:D

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

哈哈,太详细了

admin 2007-9-11 08:54

注释量是代码量的两倍以上.呵呵.

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]
页: [1]
查看完整版本: [8月CASE]一、用概率算PI