美文网首页
julia - 蒙特卡洛 - 模拟布丰投针实验

julia - 蒙特卡洛 - 模拟布丰投针实验

作者: 昵称违法 | 来源:发表于2020-04-26 17:01 被阅读0次

文章和代码参考:MATLAB模拟布丰投针实验

本文适合萌新学习蒙特卡洛入门

image.png
using Distributions
#布丰投针实验
function fn(n::Int64)
    """
    n:每次实验投针的次数(n次投针)
    """
    l = 0.6      #针的长度
    a = 1        #平行线的宽度    
    k = 0        #记录针与平行线相交的次数
    y = rand(Uniform(0.0, a/2), n)   #在[0, a/2]内服从均匀分布随机产生n个数
    theta = rand(Uniform(0.0,π), n) #在[0, pi]内服从均匀分布随机产生n个数
    for i=1:n
        if y[i] < (l/2)*sin(theta[i]) 
            k = k + 1
        end
    end
    f = k / n
    Pi = (2*l*n)/(a*k)
    return Pi
end
#测试代码
fn(1000) |> println
fn(10000000) |> println

3.076923076923077
3.139287847319689

#重复实验
function main(times::Int64,n::Int64)
    """
    times:实验重复的次数
    n:每次实验投针的次数(做n次投针)
    """
    res = Array{Float64}(undef,times)
    for j = 1:times      
        res[j] = fn(n)
    end
    return res
end
@time res = main(10000,10000)
res |> describe

2.048339 seconds (53.30 k allocations: 1.492 GiB, 6.01% gc time)
Summary Stats:
Length: 10000
Missing Count: 0
Mean: 3.141537 #所计算的10000个 Pi值求平均值
Minimum: 2.994012
1st Quartile: 3.114456
Median: 3.140539
3rd Quartile: 3.168108
Maximum: 3.298516
Type: Float64

总结:蒙特卡洛计算量比较大,本文如果进行main(10000,1000000)【一万次实验,每次投针一百万次】,耗时240秒,解决方案:多线程,多进程,Gpu计算

相关文章

网友评论

      本文标题:julia - 蒙特卡洛 - 模拟布丰投针实验

      本文链接:https://www.haomeiwen.com/subject/iasyihtx.html