Buffon's Needle
An Analysis and Simulation
蒲丰投针实验是一个著名的概率实验,其原理请参见此页:
现在我们利用Matlab来做模拟,顺便说一下,这种随机模拟方法便是传说中的“蒙特-卡洛(Monte-Carlo)”法。以下是Matlab程序
clear
a=1;% 设置两条平行线之间的距离
l=0.6;% 投针的长度
counter=0;% 针与平行线相交的次数
n=10000000;% 投掷次数
x=unifrnd(0,a/2,1,n);%产生n个(0,a/2)之间均匀分布的随机数,这里a/2是投针的中点到最近的平行线的距离
phi=unifrnd(0,pi,1,n);% 产生n个(0,pi)之间均匀分布的随机数,这里pi是投针到最近的平行线的角度
for i=1:n
if x(i)<l*sin(phi(i))/2 % 只要x小于l*sin(phi(i))/2,则相交
counter=counter+1;
end
end
frequency=counter/n; % 计算相交的频率,即相交次数比总次数
Pi=2*l/(a*frequency) % 从相交的频率总求的pi
%运行结果
>> test
Pi =
3.1416
An Analysis and Simulation
蒲丰投针实验是一个著名的概率实验,其原理请参见此页:
现在我们利用Matlab来做模拟,顺便说一下,这种随机模拟方法便是传说中的“蒙特-卡洛(Monte-Carlo)”法。以下是Matlab程序
clear
a=1;% 设置两条平行线之间的距离
l=0.6;% 投针的长度
counter=0;% 针与平行线相交的次数
n=10000000;% 投掷次数
x=unifrnd(0,a/2,1,n);%产生n个(0,a/2)之间均匀分布的随机数,这里a/2是投针的中点到最近的平行线的距离
phi=unifrnd(0,pi,1,n);% 产生n个(0,pi)之间均匀分布的随机数,这里pi是投针到最近的平行线的角度
for i=1:n
if x(i)<l*sin(phi(i))/2 % 只要x小于l*sin(phi(i))/2,则相交
counter=counter+1;
end
end
frequency=counter/n; % 计算相交的频率,即相交次数比总次数
Pi=2*l/(a*frequency) % 从相交的频率总求的pi
%运行结果
>> test
Pi =
3.1416