clc,clear,close all
a=1; %平行线间距
l=a/2; %针长
x=repmat([-0.5;8.5],1,9);
y=repmat(linspace(0,8,9),2,1);
line(x,y)
hold on %固定图像框
n=1e3; %投针次数
countNeedle=0; %记录针与线相交次数,初始值为0
% 预分配内存,加快程序运行速度
needleXL=zeros(1,n);
needleYL=zeros(1,n);
theta=zeros(1,n);
needleXR=zeros(1,n);
needleYR=zeros(1,n);
my_pi=zeros(1,n);
for i=1:n
needleXL(i)=8*rand; %随机生成投针的起始点横坐标
needleYL(i)=8*rand; %随机生成投针的起始点纵坐标
theta(i)=pi*rand; %随机生成针与线的夹角
needleXR(i)=needleXL(i)+l*cos(theta(i)); %计算投针的另一端点横坐标
needleYR(i)=needleYL(i)+l*sin(theta(i)); %计算投针的另一端点纵坐标
plot([needleXL(i),needleXR(i)],[needleYL(i),needleYR(i)],'b') %画出投针的位置
if fix(needleYL(i))~=fix(needleYR(i)) %判断针与线是否相交
countNeedle=countNeedle+1; %记录针与线相交次数
end
my_pi(i)=i/countNeedle;
end
piEst=n/countNeedle; %计算pi的近似值
disp(['共投针',num2str(n),'次, ','其中与平行线相交',num2str(countNeedle),'次, ','Pi的估计值为',num2str(piEst),'.'])
figure
plot(my_pi)
line([0,n],[pi,pi],'LineWidth',2,'LineStyle','--','color','r')
2021年3月10日17:21:42
2022年3月22日14:00:07 有少许改动
哪里不懂可以在评论区留言