我试图通过检查一对随机变量在圆内的频率来估计pi的值。
我将绘制更多的随机数(1,000,000或更多),并计算圆周内点的分数乘以盒子的面积。
盒子的面积是2x2=4,如果是x^2+y^2≤1,那么一对就在圆圈内或圆圈上。
首先,如何绘制一个圆x^2 + y^2 =1?
发布于 2018-10-17 16:31:25
以下是如何使用rand
方法计算π的三个示例。前两个使用生成器,而最后一个是普通循环。请注意,我避免创建数组,以避免内存分配。
pisum1(N) = count(true for _ in 1:N if rand()^2 + rand()^2 <= 1) * 4/N
pisum2(N) = count(rand()^2 + rand()^2 <= 1 for _ in 1:N) * 4/N
function pisum3(N)
s = 0
for _ in 1:N
s += (rand()^2 + rand()^2 <= 1)
end
return 4s/N
end
让我们测试一下它们有多快:
julia> using BenchmarkTools
julia> N = 10^7
10000000
julia> @btime pisum1($N)
105.221 ms (0 allocations: 0 bytes)
3.1410964
julia> @btime pisum2($N)
81.046 ms (0 allocations: 0 bytes)
3.1416524
julia> @btime pisum3($N)
34.942 ms (0 allocations: 0 bytes)
3.141756
如果你想要性能,你应该使用直线循环。
发布于 2018-10-17 14:21:45
使用Plots.jl
可以在一条直线上绘制一个圆
using Plots
gr()
plot(cos, sin, 0, 2pi, line=4, leg=false, fill=(0,:orange), aspect_ratio=1)
这将绘制0到2pi之间的cos
和sin
分量(x和y坐标),然后填充曲线之间的区域。固定纵横比可确保圆看起来像一个圆。这是结果图:
感谢DNF指出了一个简单的解决方案。
发布于 2018-10-17 12:03:08
如果你只想估计pi,你不需要绘制任何东西。生成一个n乘2的矩阵,每个元素都是法线。然后,您可以遍历各行,查看平方和是否小于1。
https://stackoverflow.com/questions/52844412
复制相似问题