Buffon’s needle problem

pi ~ (2l/a)(m/n)

  1. function buffonNeedle(a,l,q)
  2. format long;
  3. n=0;
  4. h=rand(q,1);
  5. h=(a/2).*h;
  6. theta=rand(q,1);
  7. theta=(pi).*theta;
  8. for m=1:q
  9. if h(m)<=sin(theta(m))*(l/2)
  10. n=n+1;
  11. end
  12. end
  13. (2*l*m)/(a*n)
  14. %save as buffonNeedle.m Note that
  15. %a is leading; l is length of needle; q is repeated times;

When executing, gives

buffonNeedle(10,6,1e6)

ans =

   3.141385927114611;

答案最大误差约为0.1,或者千分之5以内。

Area of the unit circle

function ucpi(n)
format long;
x=rand(n,1);
y=rand(n,1);
i=1;
m=0;
for i=1:n
    if x(i)^2+y(i)^2<=1
        m=m+1;
    end
end
4*m/n

%save as ucpi.m

Gives:

ucpi(1e6)

ans =

   3.14282400000000

写这个程序的时候,我发现一个很有意思的事情。一开始,我是通过下面这种方法实现的:

%THIS FUNCTION DOES NOT WORK AS INTENDED----------------------------------

function ucpi(n)
format long;
t=rand(n,1);
i=1;
m=0;
for i=1:n
    if t(i)<=sqrt(1-t(i)^2)
        m=m+1;
    end
end
4*m/n

很好理解我是怎么想的,选取一个数,比如0.2,带到单位圆里算,如果他在单位圆里面的话,就会满足x^2 + y^2 <1;
或者, y<= sqrt(1-x^2) 也就是t(i)<=sqrt(1-t(i)^2)这一行。
执行,发现答案在2.8附近,也就是正确答案pi的0.9倍。
怎么回事?
整理这一行公式:(2t(i)^2<=1)时计数,和源程序的区别,在于此时x和y兼并成了一个t。
也就是说,这个程序所给出的 m/n的数值,为x=y这条线上,在圆内和在圆外部分的占比,或者, 1/sqrt(2);
那试着跑一下:

function ucpi(n)
format long;
t=rand(n,1);
i=1;
m=0;
for i=1:n
    if t(i)<=sqrt(1-t(i)^2)
        m=m+1;
    end
end
m/n

>>>>>>>--------------------------------------------------------------------
ucpi(1e6)

ans =

   0.70775100000000
%     0.70710678118655 为 1/sqrt(2)的值

哦,原来如此。哈哈哈。